我正在使用带有 Apache Qpid (0.3) 作为 Java 客户端的 Azure 服务总线队列(AMQP 协议)。
我还使用 Spring JmsTemplate 来生成消息,并使用 DefaultMessageListenerContainer 来管理我的消费者,spring JMS 4.0.6。
弹簧配置:
@PostConstruct
private void JndiLookup() throws NamingException {
// Configure JNDI environment
Hashtable<String, String> envPrp = new Hashtable<String, String>();
envPrp.put(Context.INITIAL_CONTEXT_FACTORY,
PropertiesFileInitialContextFactory.class.getName());
envPrp.put("connectionfactory.SBCF", "amqps://owner:{parimeryKey}@{namespace}.servicebus.windows.net");
envPrp.put("queue.STORAGE_NEW_QUEUE", "QueueName");
context = new InitialContext(envPrp);
}
@Bean
public ConnectionFactory connectionFactory() throws NamingException {
ConnectionFactory cf = (ConnectionFactory) context.lookup("SBCF");
return cf;
}
@Bean
public DefaultMessageListenerContainer messageListenerContainer() throws NamingException {
DefaultMessageListenerContainer messageListenerContainer = new DefaultMessageListenerContainer();
messageListenerContainer.setConnectionFactory(connectionFactory());
Destination queue = (Destination) context.lookup("QueueName");
messageListenerContainer.setDestination(queue);
messageListenerContainer.setConcurrency("3-10");
MessageListenerAdapter adapter = new MessageListenerAdapter();
adapter.setDelegate(new MessageWorker());
adapter.setDefaultListenerMethod("onMessage");
messageListenerContainer.setMessageListener(adapter);
return messageListenerContainer;
}
@Bean
public JmsTemplate jmsTemplate() throws NamingException {
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setConnectionFactory(connectionFactory());
return jmsTemplate;
}
配置中没有什么花哨的,只是直截了当。
运行代码,一切似乎都在工作..但是在队列中没有流量的几分钟后,消费者似乎正在失去与队列的连接并且没有接收消息。
我不知道它是否相关,但每隔 5 分钟就会收到以下警告:
Fri Nov 07 15:23:53 +0000 2014, (DefaultMessageListenerContainer.java:842) WARN : Setup of JMS message listener invoker failed for destination 'org.apache.qpid.amqp_1_0.jms.impl.QueueImpl@8fb0427b' - trying to recover. Cause: Force detach the link because the session is remotely ended.
Fri Nov 07 15:23:56 +0000 2014, (DefaultMessageListenerContainer.java:891) INFO : Successfully refreshed JMS Connection
我有消息在队列中排了几个小时,只有当我重新启动应用程序时消费者才正确地更新连接并获取消息时才被消费者处理。
问题可能出在 Spring Listener 容器属性或 qpid 连接工厂,还是 Azure 服务总线的问题?
找不到与我的情况相关的帖子将不胜感激!