【发布时间】:2016-08-30 13:05:03
【问题描述】:
我能够连接和使用来自 Azure 服务总线队列的消息。但是在消息处理过程中会随机出现以下错误。出现错误后,消息似乎没有被进一步消耗,或者它们被推送到 DLQ。重新启动侦听器应用程序会导致出现相同的异常。
我正在使用带有 Apache Qpid 的 Spring DefaultMessageListenerContainer
2016-05-05 01:49:36.303 WARN 14716 — [nerContainer-61] o.s.j.l.DefaultMessageListenerContainer : JMS 消息的设置 目标的侦听器调用程序失败 'org.apache.qpid.amqp_1_0.jms.impl.QueueImpl@5f61cba7' - 试图 恢复。原因:等待附加超时
未知端点 传输{handle=0,deliveryId=36,deliveryTag=P\xb8)T\xd9\xea%A\x95\xe5Fj]\x91\x00\x15,messageFormat=0,more=false,batchable=true} 未知端点 Transfer{handle=0,deliveryId=36,deliveryTag=\xdc\x9b\x9d\xf5\x817\x9bO\x97.\x19\xeam
javax.jms.IllegalStateException: 关闭时间 org.apache.qpid.amqp_1_0.jms.impl.SessionImpl.checkClosed(SessionImpl.java:326) 在 org.apache.qpid.amqp_1_0.jms.impl.SessionImpl.getTransacted(SessionImpl.java:222) 在 org.springframework.jms.listener.AbstractMessageListenerContainer.commitIfNecessary(AbstractMessageListenerContainer.java:757) 在 org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:665) 在 org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:315) 在 org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:253) 在 org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1158) 在 org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1052) 在 java.lang.Thread.run(Unknown Source)
更新:
`public DefaultMessageListenerContainer messageListenerContainer() throws NamingException {
DefaultMessageListenerContainer messageListenerContainer = new DefaultMessageListenerContainer();
messageListenerContainer.setConnectionFactory(connectionFactory());
Destination queue = (Destination) context.lookup("STORAGE_NEW_QUEUE");
messageListenerContainer.setDestination(queue);
messageListenerContainer.setConcurrency(concurrency);
messageListenerContainer.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
messageListenerContainer.setCacheLevel(DefaultMessageListenerContainer.CACHE_SESSION);
messageListenerContainer.setErrorHandler(new EDIMessageErrorHandler());
MessageListenerAdapter adapter = new MessageListenerAdapter();
adapter.setDelegate(new EDIMessageListener());
adapter.setDefaultListenerMethod("onMessage");
messageListenerContainer.setMessageListener(adapter);
return messageListenerContainer;
}`
请告知可能是什么问题。
谢谢
【问题讨论】:
-
问:那么 Azure 端的日志是怎么说的呢?您的 Spring/QPid 日志仅显示“我尝试通信时超时”。这就是问题的“结果”。你需要找到CAUSE。听起来您需要查看 1)您的 Azure 服务,以及 2)您在 AZure 和 QPid 之间的网络通信......除了查看日志和/或检测您的 Azure 服务之外,您可能还需要 Wireshark跟踪。
-
抱歉回复晚了。您能否告知我如何在 Azure 上获取服务总线队列的日志。我只能看到命名空间上不可用的操作日志链接。请注意,消息侦听器正在 Azure VM 上运行。我已经更新了我的 DMLC 配置。
-
@pkumar 哪里可以解决这个问题?
标签: java spring azure servicebus