【发布时间】:2016-05-19 08:48:37
【问题描述】:
在一个项目中,我使用ActiveMQ来处理比较多的消息。为此,有一个队列fooQueue,其中包含要处理的消息。
应用程序的两个实例正在使用 Spring JMS 处理来自该队列的消息。我通过以下方式设置了DefaultMessageListenerContainer。
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setDestinationName(QUEUE_NAME);
container.setMessageListener(myMessageListener);
container.setConcurrency(getProperty("concurrency"));
container.setSessionTransacted(true);
container.setErrorHandler(new ErrorHandler());
return container;
通过查看 AMQ Web 控制台,我可以确认创建了正确数量的消费者和会话(会话/消费者)。但是,似乎一个会话正在完成大部分工作,这会导致应用程序有时被冻结。
该会话使大多数消息入队和出队,所有其他消息都远远少于它。如果我重新启动这两个应用程序实例之一,应用程序实例中的一个会话会接手工作,并且行为相同。
除了检查myMessageListener 是否阻塞之外,我还能做些什么吗?
【问题讨论】:
-
您的事务管理是如何定义的?我有一个类似的问题,发送一堆消息会阻止在发送时使用相同的 connectionFactory 读取消息,结果是消息发送是在一个大型且长时间运行的事务中完成的。
-
好提示。我将不得不检查它,但我已经看到一些线程等待提交事务。你是如何解决你的问题的?接收和发送的单独连接?
-
我通过每条消息发送一个事务而不是一个大事务来解决这个问题。这些交易也做了一些 JPA 的事情..
-
如果您使用的是 Spring JMS,您能否给我一个关于如何完成此任务的提示?谷歌搜索时没有发现任何明显的东西。:/
-
我使用的是 sping jmstemplate 和 spring
@Transactional,所以基本上将@Transactional注释移到调用链的下方。
标签: java activemq spring-jms consumer