2017-08-01 6 views
0

JMSリスナーが停止した後、この例外が表示され続けます。展開後、2日間のログファイルは約6.2GBでした。イベントのためにその間にリスナーコンテナが停止したために受信メッセージが拒否されました。

2017-08-01 12:14:36.436 WARN 4456 --- [er (4102308050)] o.s.j.l.SimpleMessageListenerContainer : Rejecting received message because of the listener container having been stopped in the meantime: ObjectMessage={ Header={ JMSMessageID={ID:EMSATIBDEV0.291559497D151:2A78089} JMSDestination={Queue[JP.PROGRAMGUIDE.DATALOAD.SUB.Q]} JMSReplyTo={null} JMSDeliveryMode={PERSISTENT} JMSRedelivered={true} JMSCorrelationID={null} JMSType={null} JMSTimestamp={Tue Aug 01 12:03:23 JST 2017} JMSDeliveryTime={Tue Aug 01 12:03:23 JST 2017} JMSExpiration={0} JMSPriority={4} } Properties={ JMSXDeliveryCount={Integer:3} } Object={com.compa[email protected]66820b} } 

私はすべてのアイデアをいただければ幸いですApplicationListener

@EventListener 
public void onApplicationEvent(ProgramGuideManagerEvent<String> event) { 
    log.trace("In ProgramGuideManagerEventListener"); 
    synchronized (syncObject) { 
     if (event.isError()) { 
     errorCount++; 
     if (errorCount >= maxErrorCount) { 
      log.error("Maximum sequential errors [errorCount=" + errorCount+ "] occurred. Listener will be stopped."); 
      String listenerName = (String) event.getSource(); 
      Map<String, JmsListenerEndpointRegistry> map = context.getBeansOfType(JmsListenerEndpointRegistry.class); 
      Set<String> set = map.keySet(); 
      // JMS Listeners 
      for (String key : set) { 
       JmsListenerEndpointRegistry value = map.get(key); 
       if (value != null) { 
        Set<String> listeners = value.getListenerContainerIds(); 
        for (String name : listeners) { 
         if (name.toUpperCase().equalsIgnoreCase(listenerName)) { 
          MessageListenerContainer jms = value.getListenerContainer(name); 
          jms.stop(); 
         } 
        } 
       } 
      } 
     } 
    } else { 
     errorCount = 0; 
    } 
} 

}

を実装して、この機能を持って聞いて。

+1

これはどのようにスプリングバッチに関連していますか? –

+0

@IgorKonoplyanko申し訳ありません。春のバッチと一緒に長い間実行されていた。 –

答えて

0

メッセージ配信スレッドでコンテナを停止しないでください。新しいスレッドを生成してコンテナを停止します。あなたはたぶんいくつかのエラーを見るでしょうが、それはかなり早く止まるべきです。余分なクリーンアップを行うには、アトミックブール値をtrueに設定して、コンテナが停止したことを示すようにして、実行時例外の次回の配信をスローし、追加のストップスレッドが生成されないようにします。

関連する問題