由于侦听器容器在此期间已停止,因此拒绝收到的消息:

时间:2017-08-01 04:59:27

标签: jms

在我的JMS侦听器停止后,我不断打印此异常打印。部署后,日志文件两天大约为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.company.programguide.dataload.model.vo.ProgramGuideDataloadDetailsVo@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 :(得分:0)

您不应该在邮件传递线程中停止容器。生成一个新线程来停止容器。您可能会看到一些错误,但它应该很快停止。为了获得额外的清洁度,请将原子布尔值标记为true以指示容器已发出停止,以便您可以在下次交付时抛出运行时异常并防止生成其他停止线程。