リスナをいつ終了するのが適切な方法、または一般的な規約は何ですか?私は本当にどこでも確かな答えを見つけることができないようです。私が扱っているキューはIBMのMQキューですが、私は2033年のエラーコード(私の会社は他のアプリケーションでこれを行います)を受け取るまで読んでおくのが一般的だと知っています。その時点で、あなたは包むことができますが、SpringBoot Jmsアプリケーションここでの大会は何ですか?キューが空になると、リスナーはメッセージが来るまでハングします。もし私が望むなら、それを殺す方法を知っていますが、どうすればわかることができますか?例としてキューにゼロのメッセージがあるときにSpringBootでJmsリスナを終了するタイミングを判断する
は、ここで私は一緒に
@Configuration
@EnableTransactionManagement
public class JmsConfig {
@Bean
protected DefaultJmsListenerContainerFactory defaultJmsListenerContainerFactory() throws JMSException {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(mqQueueConnectionFactory());
factory.setConcurrency("1");
factory.setSessionTransacted(true);
factory.setAutoStartup(true);
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
factory.setErrorHandler(new JmsErrorHandler());
return factory;
}
@Bean
public MQQueueConnectionFactory mqQueueConnectionFactory() {
MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
mqQueueConnectionFactory.setHostName(host);
try {
mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
mqQueueConnectionFactory.setCCSID(1208);
mqQueueConnectionFactory.setChannel(channel);
mqQueueConnectionFactory.setPort(port);
mqQueueConnectionFactory.setQueueManager(queueManager);
} catch (Exception e) {
e.printStackTrace();
}
return mqQueueConnectionFactory;
}
、ここを投げたサンプルプロジェクトの設定は、文字通りメインクラスとのErrorHandler、ほかリスナー
@Component
public class Consumer {
@JmsListener(id = "myQueue", destination = "queue")
public void processMessage(Message message) throws MQException, IOException {
try {
String messageString = ((TextMessage) message).getText();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
でありますサンプルプロジェクト全体を処理し、メッセージを処理します。私が他のアプリケーションで行ったことは、MQQueue
がキューの値を与えられたときにインスタンス化され、ちょうど単純にqueue.getCurrentDepth()
でした。ゼロが得られたら、ListenerContainerControllerのインスタンスを呼び出してから、キューidを指定してJmsListenerEndpointRegistryから停止します。
Springには、「あなたのキューは空になりました」という簡単な通信方法がありますか、それともx時間が経過した後に終了する方法はありますか?
なぜシャットダウンしますか?実行中のままにしておくと、新しいメッセージが処理されます。キューに入れられます。 – JoshMc
@ JoshMcこのインスタンスでは、メッセージを読み取って処理し、キューをパージして何も残さないように処理したレポートを生成します。それは毎日の実行プロセスであり、あなたが記述した方法を設定するかどうかはわかりません。あなたのコメントは私がこのJmsListenerをちょっと変わって使っているのかどうか疑問に思います。しかし、プロセスは一度実行されようと、正しくリスニングされても、いつか終了する必要がありますか? –
リスナーを使用しないでください。もしそれが全てであれば、 'JmsTemplate'を使い、何も読むことがなくなるまで読み込みます。レポートを作成し、それを完了します。リスナーは、メッセージが流れている間、メッセージの実行と処理を継続することを意図しています。 Springバッチと 'JmsItemReader'を使って、何も読むことがなくなるまでメッセージを読むことができます。 –