如何干净地关闭高并发Jms.messageDrivenChannelAdapter



当我试图关闭spring集成进程时,使用入站Jms.messageDrivenChannelAdapter的流会抛出以下错误消息:

"org.springframework.jms.listener.DefaultMessageListenerContainer-由于侦听器容器在此期间被停止而拒绝接收到的消息";

我的入站适配器定义如下:

Jms.messageDrivenChannelAdapter(
Jms.container(jmsConnectionFactory, destinationName)
.concurrency(highConcurrency)
.get()
)

我相信我的问题是;receiveTimeout";上的jms容器太小,并且我需要增加该值以满足我的";高并发性";(对吗?(,作为";receiveTimeout";似乎是容器"的唯一值;doShutdown";方法关心。现在,receiveTimeout属性的sourceCode表示";该值需要小于事务超时";。此外,关于入站jms适配器的spring集成文档说";如果您希望整个流是事务性的[…],请考虑使用jms消息驱动的通道适配器,并将确认设置为事务性(默认(";,这似乎意味着jms适配器在默认情况下是事务性的
因此,我的主要问题是:即使我没有使用任何显式事务管理器,我是否不仅需要显式地设置"receiveTimeout";在我的集装箱上;transactionTimeout";transactionTimeout>receiveTimeout
非常感谢您的专业知识和时间
向致以最良好的问候

这不是"投掷";。这只是警告:

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();
}

并注意CCD_ 1。因此,即使接收到的消息以某种方式滑入该侦听器函数,整个环境也会确保状态不会中断,数据不会丢失——会话会回滚。

如果不使用transactionManager,则transactionTimeout没有意义。Spring Integration使它成为transacted,正好用于我们在警告日志中看到的用例。

最新更新