2017-07-13 10 views
2

リスナをいつ終了するのが適切な方法、または一般的な規約は何ですか?私は本当にどこでも確かな答えを見つけることができないようです。私が扱っているキューは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時間が経過した後に終了する方法はありますか?

+0

なぜシャットダウンしますか?実行中のままにしておくと、新しいメッセージが処理されます。キューに入れられます。 – JoshMc

+0

@ JoshMcこのインスタンスでは、メッセージを読み取って処理し、キューをパージして何も残さないように処理したレポートを生成します。それは毎日の実行プロセスであり、あなたが記述した方法を設定するかどうかはわかりません。あなたのコメントは私がこのJmsListenerをちょっと変わって使っているのかどうか疑問に思います。しかし、プロセスは一度実行されようと、正しくリスニングされても、いつか終了する必要がありますか? –

+4

リスナーを使用しないでください。もしそれが全てであれば、 'JmsTemplate'を使い、何も読むことがなくなるまで読み込みます。レポートを作成し、それを完了します。リスナーは、メッセージが流れている間、メッセージの実行と処理を継続することを意図しています。 Springバッチと 'JmsItemReader'を使って、何も読むことがなくなるまでメッセージを読むことができます。 –

答えて

3

JmsListenerは、宛先に到着したメッセージを受信して​​処理することを目的としています。宛先が空であることを確認してから停止するまでは、読み取りを継続するように設計されています。

代わりに、完了するまでメッセージを読むには、JmsTemplateとそのreceiveメソッドを使用してください。その後、それらを処理してレポートを作成します。

最終的には、JmsItemReaderを使用してSpringバッチジョブを作成することもできます。この読者は、それ以上読む必要がなくなり、すべて終了します。その下にはまた、JmsTemplate

を使用しています。あなたは、Spring Bootを使用しているときにcronジョブを使用してこのジョブを毎日トリガーします(基本的に作成したjarを起動します)。 batch applicationsの使い方については、Spring Bootのリファレンスガイドも参照してください。

関連する問題