Java DefaultJmsListenerContainerFactory配置进程并发性
我正在为JmsFactory配置并发性,以便使用队列 我做到了:Java DefaultJmsListenerContainerFactory配置进程并发性,java,spring,jms,spring-jms,Java,Spring,Jms,Spring Jms,我正在为JmsFactory配置并发性,以便使用队列 我做到了: @Bean(name = "myFactory") public DefaultJmsListenerContainerFactory sqsFactory(SQSConnectionFactory connectionFactory, CustomJmsListenerConfigurer configurer) { DefaultJmsListenerContainerFacto
@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);
/**
*指定一个任务中要处理的最大消息数。
*更具体地说,这限制了消息接收尝试的次数
*每个任务,其中包括接收实际上不存在的迭代
*拾取消息,直到他们达到超时(请参阅
*{@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;
}
}