【发布时间】:2020-06-15 15:13:06
【问题描述】:
我有以下 Spring JMS 工厂配置:
@Bean(name = "jmsListenerFactory")
public DefaultJmsListenerContainerFactory jmsListenerFactory() throws Exception {
DefaultJmsListenerContainerFactory container = new DefaultJmsListenerContainerFactory();
container.setErrorHandler(new MqErrorHandler());
container.setConnectionFactory(connectionFactory);
container.setTransactionManager(transactionManager);
container.setConcurrency("5-10");
return container;
}
监听器设置:
@JmsListener(destination = ACK_QUEUE, containerFactory = "jmsListenerFactory")
@Transactional
public void receive(String response) throws Exception {
try {
logger.debug(response);
Msg ackNack = (Msg) unmarshaller.unmarshal(new StringReader(response));
... and so on
... should acknowledge JMS and commit DB update
}
JTA 事务管理器:
public JtaTransactionManager jbossTransactionManager() throws Exception {
JtaTransactionManager transactionManager = new JtaTransactionManager();
transactionManager.setTransactionManagerName("java:/TransactionManager");
return transactionManager;
}
我有一个 Oracle 数据库和一个通过 JNDI 包含的 JMS 连接工厂资源,两者都与 XA 兼容。
问题是某些 JMS 消息没有发送到侦听器。它们 100% 提供给队列,但就像它们只是“消失”一样。即使达到 TRACE 级别,也不会在日志中报告任何日志记录或错误。
没有其他人正在监听此队列,并且正在从同一队列成功处理类似的事务。我无法以任何有保证的方式重现它,而且它是完全断断续续的。
有什么想法吗?
【问题讨论】:
-
运行某种跟踪,例如Activity Trace,看看是什么让你的队列中的消息。
-
@MoragHughson Activity Trace 是一个很好的建议。
标签: spring ibm-mq jboss7.x spring-jms jta