Spring DefaultJmsListenerContainerFactory在JBoss EAP 7上删除消息

Spring DefaultJmsListenerContainerFactory在JBoss EAP 7上删除消息,spring,ibm-mq,jboss7.x,spring-jms,jta,Spring,Ibm Mq,Jboss7.x,Spring Jms,Jta,我有以下Spring JMS工厂配置: @Bean(name = "jmsListenerFactory") public DefaultJmsListenerContainerFactory jmsListenerFactory() throws Exception { DefaultJmsListenerContainerFactory container = new DefaultJmsListenerContainerFactory(); container.setErr

我有以下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%提供给队列的,但就像它们消失了一样。即使在跟踪级别,日志中也没有报告日志记录或错误

没有其他内容正在侦听此队列,类似的事务正在从同一队列中成功处理。我不能以任何保证的方式复制它,它完全是断断续续的


有什么想法吗?

问题已得到解决,因为开发人员队列管理器正在默默地使用消息。。。这是无效的配置。

这里要吸取的教训是永远不要假设以下情况:

没有其他内容正在侦听此队列

有几种方法可以尝试并验证这一点:

检查当前有多少进程为输入打开了队列:

DIS QLQUEUENAME IPPROCS

显示队列当前使用OPENOPTS打开的所有连接,OPENOPTS包括MQOO_INPUT*,这将显示IP地址(如果是客户端连接)和客户端提供的应用程序名称APPLTAG

DIS CONN*TYPEALL WHEROBJNAME EQ QUEUENAME名称

以上两种方法都只显示一个时间点视图,如果您试图找到一个应用程序,该应用程序正在连接从队列读取消息,然后断开连接,那么您可能看不到它。 正如@MoragHughson在评论中提到的,启动一个活动跟踪并查找到此队列的连接,看看连接的IP/应用程序名称是否符合预期,这样做的优点是,您可以在一段时间内看到所有连接到此队列的内容。 下面是使用IBM MQ v9.1或更高版本的amqsevt并以IBM MQ v9.0或更高版本的队列管理器为目标实现这一点的一种方法的示例—这依赖于名为jq的开源JSON处理器。以下示例将一直运行,直到5分300秒没有活动为止,或者直到按下一个键为止,您可以通过增加-w值来增加时间:

将字符串_Replace_替换为_QMGR_NAME_u替换为队列管理器名称。 将字符串_Replace_替换为_QUEUE_NAME_u替换为您的队列名称。 amqsevt-m_替换_为_QMGR_NAME_uu-t'$SYS/MQ/INFO/QMGR/_替换_为_QMGR_NAME_uu/ActivityTrace/ConnectionId/'-w 300-o json|jq-r' .eventData |[.channelName、.channelType、.connectionName、.applName、.remoteProduct、.remoteVersion]作为$x |.activityTrace[] |select.objectName==[用队列名称替换][操作时间] +$x +[.operationId、.objectName、.resolvedQueueName、.reasonCode.value、.putDate、.putTime] |@csv '
运行某种跟踪,例如“活动跟踪”,以查看是什么使消息从您的队列中删除。@MoragHughson“活动跟踪”是一个很好的建议。很高兴您都已排序-建议您接受@JoshMc的答案,因为这是一个很好的、对未来读者非常有用的答案。