Java クライアントとして Apache Qpid (0.3) で 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 サービス バスの問題ですか??
私の状況に関連する投稿が見つかりませんでした。助けていただければ幸いです!!