【问题标题】:message-driven-channel-adapter time limit processing消息驱动通道适配器时间限制处理
【发布时间】:2016-10-24 18:22:08
【问题描述】:

是否可以指定消息的处理时间,如果超过,抛出TIMEOUT异常?我尝试设置事务超时,但没有奏效。时间过去了,没有抛出异常。甚至 DefaultTransactionDefinition.getTimeout() 方法也没有被调用(在调试器中有一个断点)。使用正确的值调用了 DefaultTransactionDefinition.setTimeout(int)。

这是我的设置:

<int-jms:message-driven-channel-adapter id="x"
                                        channel="incoming"
                                        container="my"
                                        error-channel="errors"/>

容器“我的”扩展了 DefaultMessageListenerContainer,这就是我拥有的地方:

@Override
@Autowired
@Value("5")
public void setTransactionTimeout(final int transactionTimeoutInSec)
{
  super.setTransactionTimeout(transactionTimeoutInSec);
}

还有其他方法吗?谢谢!

【问题讨论】:

  • 可能是你没有配置外部transaction-manager的问题?..

标签: spring-integration spring-transactions


【解决方案1】:

我想知道您是否可以至少对原始 java 做类似的事情,而不是 Spring Integration。我的意思是我不知道任何可能的方法来限制方法调用的持续时间。当然,我们可以以某种方式通过异步调用和一些线程屏障来等待和中断所需的异常。至少timeout&lt;gateway&gt; 上是这样工作的。但那是用于请求回复的。在您的情况下,它是单向流。

尽管您可以像我建议的那样考虑一些带有异步切换的 AOP 建议,CountDownLatch 让每条消息等待,并将等待时间限制为所需的 timeout

从另一面来看,像&lt;barrier&gt; 这样的开箱即用组件,真的可以帮助你:

  1. 您需要&lt;recipient-list-router&gt; 和第一个ExecutorChannel 收件人才能向目标服务发送消息
  2. 第二个收件人应该是DirectChannel for &lt;barrier&gt; 以阻塞主线程以获得所需的timeout 或良好的结果。
  3. 你应该在实际服务流程中的某个地方弄清楚如何triggerBarrierHandler才能正确释放主线程。
  4. 不要忘记将其require-reply 配置为true。在这种情况下,ReplyRequiredException 被抛出。您应该以某种方式捕获(例如 error-channel 的处理程序并将其包装到所需的 TimeoutException 中)
  5. 别忘了指定一些正确的correlation-strategy to。

但是...请确保这不会对您的系统造成开销,让我们尝试了解您是否真的需要担心处理超时。

【讨论】:

    猜你喜欢
    • 2014-01-23
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    相关资源
    最近更新 更多