消息驱动的通道适配器时间限制处理

时间:2016-06-22 17:02:56

标签: spring-integration spring-transactions

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

这是我的设置:

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

Container&#34; my&#34;扩展DefaultMessageListenerContainer,这就是我所拥有的:

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

还有其他方法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

我想知道你是否可以为至少原始java而不是Spring Integration做类似的事情。我的意思是我不知道任何限制方法调用持续时间的方法。当然,我们可以通过异步调用以及一些线程障碍以某种方式来执行此操作以等待并中断所需的异常。至少这是timeout<gateway>起作用的方式。但那个是请求回复。在你的情况下,它是单向流动。

虽然您可以考虑使用我建议的异步切换的一些AOP建议,并等待每条消息等待CountDownLatch,并将等待时间限制为所需的timeout

另一方面,有<barrier>之类的开箱即用组件,它可以帮助你:

  1. 您需要<recipient-list-router>与第一个ExecutorChannel收件人一起向目标服务发送消息
  2. DirectChannel的第二个收件人应为<barrier>,以阻止所需timeout的主线索或效果良好。
  3. 您应该在实际服务流程中的某处找出如何trigger BarrierHandler正确释放主线程。
  4. 请勿忘记将其require-reply配置为true。在这种情况下,抛出ReplyRequiredException。你应该以某种方式捕捉(例如error-channel的处理程序并将其包装到所需的TimeoutException
  5. 不要忘记指定一些适当的correlation-strategy来。
  6. 但是......请确保它不是您系统的开销,让我们试着了解您是否真的需要担心处理超时。