Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DefaultJmsListenerContainerFactory配置进程并发性_Java_Spring_Jms_Spring Jms - Fatal编程技术网

Java DefaultJmsListenerContainerFactory配置进程并发性

Java DefaultJmsListenerContainerFactory配置进程并发性,java,spring,jms,spring-jms,Java,Spring,Jms,Spring Jms,我正在为JmsFactory配置并发性,以便使用队列 我做到了: @Bean(name = "myFactory") public DefaultJmsListenerContainerFactory sqsFactory(SQSConnectionFactory connectionFactory, CustomJmsListenerConfigurer configurer) { DefaultJmsListenerContainerFacto

我正在为JmsFactory配置并发性,以便使用队列

我做到了:

  @Bean(name = "myFactory")
  public DefaultJmsListenerContainerFactory sqsFactory(SQSConnectionFactory connectionFactory,
      CustomJmsListenerConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    configurer.configure(factory, connectionFactory);
    factory.setConcurrency("1-3");
    return factory;
  }
我看到DefaultJmsListenerContainerFactory.setConcurrency调用DefaultMessageListenerContainerContainer

我在应用程序中配置了2个队列,我使用的是spring boot:

@JmsListener(destination = "queue1", containerFactory = "myFactory")
@JmsListener(destination = "queue2", containerFactory = "myFactory")
我正在阅读spring文档,遇到了一些方法,现在我有些怀疑

1-以下各项之间的区别是什么:

setConcurrency(String concurrency)
setConcurrentConsumers(int concurrentConsumers)
即使阅读文档,我也不理解这种差异以及这种配置如何改变应用程序的行为。 我认为setConcurrency应该是每个@jmsLister用来从队列获取消息的线程数。。。 你能解释一个配置映像的例子吗?我有100条消息排队(每个配置的队列)

2-setMaxMessagesPerTask(int-maxMessagesPerTask)


如果我在队列上有100条消息,并发性=3,这个数字是10(默认值),那么行为是什么?

阅读这两种情况下的Javadocs

一,

setConcurrency(字符串并发)

这只是一种方便

/**
*通过“上下”字符串(例如“5-10”)或简单的
*上限字符串,例如“10”(在这种情况下,下限为1)。
*此侦听器容器将始终保留最小数量的使用者
*({@link#setConcurrentConsumers})并将慢慢扩展到最大数量
*在负载增加的情况下{@link#setMaxConcurrentConsumers}的用户数。
*/
@凌驾
public void setConcurrency(字符串并发){
试一试{
int separatorIndex=concurrency.indexOf('-');
如果(分隔索引!=-1){
setConcurrentConsumers(Integer.parseInt(concurrency.substring(0,separatorIndex));
setMaxConcurrentConsumers(Integer.parseInt(concurrency.substring(separatorIndex+1));
}
否则{
消费者(1);
setMaxConcurrentConsumers(Integer.parseInt(并发));
}
}
捕获(NumberFormatException ex){
抛出新的IllegalArgumentException(“无效的并发值[“+concurrency+”]:仅限”+
“支持单个最大整数(如“5”)和最小最大组合(如“3-5”);
}
}
setConcurrency(“1-3”)

setConcurrentConsumers(1);
setMaxConcurrentConsumers(3);
  • 对消息处理没有影响;这只意味着每10条消息循环(停止和启动)一次使用者任务
  • /**
    *指定一个任务中要处理的最大消息数。
    *更具体地说,这限制了消息接收尝试的次数
    *每个任务,其中包括接收实际上不存在的迭代
    *拾取消息,直到他们达到超时(请参阅
    *{@link#setReceiveTimeout“receiveTimeout”}属性)。
    *对于标准TaskExecutor,默认值是无限制的(-1),
    *重用原始调用程序线程直到关闭(在
    *有限动态调度的费用)。
    *如果是SchedulingTaskExecutor,表示优先选择
    *短期任务,默认值为10。指定一个数字
    *10到100条消息,以在相当长的寿命和
    *这里的任务相当短暂。
    *长寿命任务避免频繁的线程上下文切换
    *一路用同一根线粘着,虽然寿命很短
    *任务允许线程池控制调度。因此,线程
    *池通常更喜欢短期任务。
    *可以在运行时修改此设置,例如通过JMX。
    *@see#setTaskExecutor
    *@see#setReceiveTimeout
    *@see org.springframework.scheduling.SchedulingTaskExecutor#preferencesshortlivedtasks()
    */
    公共无效setMaxMessagesPerTask(int-maxMessagesPerTask){
    Assert.isTrue(maxMessagesPerTask!=0,“'maxMessagesPerTask'不能为0”);
    已同步(此.lifecycleMonitor){
    this.maxMessagesPerTask=maxMessagesPerTask;
    }
    }