在我的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;
}
}
}
任何想法都会受到赞赏。
答案 0 :(得分:0)
您不应该在邮件传递线程中停止容器。生成一个新线程来停止容器。您可能会看到一些错误,但它应该很快停止。为了获得额外的清洁度,请将原子布尔值标记为true以指示容器已发出停止,以便您可以在下次交付时抛出运行时异常并防止生成其他停止线程。