如何干净关闭高并发Jms.messageDrivenChannelAdapter?
how to cleanly shutdown high-concurrency Jms.messageDrivenChannelAdapter?
当我尝试关闭我的 spring 集成进程时,使用入站 Jms.messageDrivenChannelAdapter 的流程抛出以下错误消息:
"org.springframework.jms.listener.DefaultMessageListenerContainer - 由于侦听器容器在此期间被停止而拒绝接收到的消息"
我的入站适配器定义如下:
Jms.messageDrivenChannelAdapter(
Jms.container(jmsConnectionFactory, destinationName)
.concurrency(highConcurrency)
.get()
)
我认为我的问题是我的 jms 容器上的默认“receiveTimeout”太小,我需要增加该值以满足我的“高并发”(对吗?),如“receiveTimeout”似乎是容器“doShutdown”方法关心的唯一值。
现在,receiveTimeout 属性 的源代码说“这个值需要小于事务超时”。此外,关于入站 jms 适配器的 spring-integration doco 说“如果您希望整个流程都是事务性的 [...] )",这似乎暗示 jms 适配器默认是事务性的。
因此,我的主要问题是:即使我没有使用任何明确的事务管理器,我是否不仅需要在我的容器上明确设置“receiveTimeout”,还需要使用 transactionTimeout > receiveTimeout 明确设置“transactionTimeout”?
非常感谢您的专业知识和时间。
最好的问候
那不是“扔”。那只是警告:
protected void doExecuteListener(Session session, Message message) throws JMSException {
if (!isAcceptMessagesWhileStopping() && !isRunning()) {
if (logger.isWarnEnabled()) {
logger.warn("Rejecting received message because of the listener container " +
"having been stopped in the meantime: " + message);
}
rollbackIfNecessary(session);
throw new MessageRejectedWhileStoppingException();
}
并注意 rollbackIfNecessary(session);
。因此,即使接收到的消息以某种方式进入此侦听器函数,整个环境也会确保状态不会被破坏并且数据不会丢失 - 会话会回滚。
如果不使用 transactionManager
,transactionTimeout
就没有意义。 Spring 集成使其 transacted
完全符合我们在该警告日志中看到的用例。
当我尝试关闭我的 spring 集成进程时,使用入站 Jms.messageDrivenChannelAdapter 的流程抛出以下错误消息:
"org.springframework.jms.listener.DefaultMessageListenerContainer - 由于侦听器容器在此期间被停止而拒绝接收到的消息"
我的入站适配器定义如下:
Jms.messageDrivenChannelAdapter(
Jms.container(jmsConnectionFactory, destinationName)
.concurrency(highConcurrency)
.get()
)
我认为我的问题是我的 jms 容器上的默认“receiveTimeout”太小,我需要增加该值以满足我的“高并发”(对吗?),如“receiveTimeout”似乎是容器“doShutdown”方法关心的唯一值。
现在,receiveTimeout 属性 的源代码说“这个值需要小于事务超时”。此外,关于入站 jms 适配器的 spring-integration doco 说“如果您希望整个流程都是事务性的 [...] )",这似乎暗示 jms 适配器默认是事务性的。
因此,我的主要问题是:即使我没有使用任何明确的事务管理器,我是否不仅需要在我的容器上明确设置“receiveTimeout”,还需要使用 transactionTimeout > receiveTimeout 明确设置“transactionTimeout”?
非常感谢您的专业知识和时间。
最好的问候
那不是“扔”。那只是警告:
protected void doExecuteListener(Session session, Message message) throws JMSException {
if (!isAcceptMessagesWhileStopping() && !isRunning()) {
if (logger.isWarnEnabled()) {
logger.warn("Rejecting received message because of the listener container " +
"having been stopped in the meantime: " + message);
}
rollbackIfNecessary(session);
throw new MessageRejectedWhileStoppingException();
}
并注意 rollbackIfNecessary(session);
。因此,即使接收到的消息以某种方式进入此侦听器函数,整个环境也会确保状态不会被破坏并且数据不会丢失 - 会话会回滚。
如果不使用 transactionManager
,transactionTimeout
就没有意义。 Spring 集成使其 transacted
完全符合我们在该警告日志中看到的用例。