使用Camel中的Netty实现请求超时

时间:2012-10-25 19:43:02

标签: netty apache-camel

我有一个Camel应用程序,它使用netty组件通过TCP与远程服务器通信。服务器有挂起的倾向,所以我希望能够在请求中添加可配置的超时,这样如果在X时间内没有返回响应,我会得到一个例外。

mina组件在timeout参数中具有此功能,但netty组件似乎没有相应的选项。

我尝试使用ReadTimeoutHandler完成此操作并且接近......但不完全。首先,在初始化HashedWheelTimer

时创建CamelContext
HashedWheelTimer timer = new HashedWheelTimer();
JndiRegistry jndi = new JndiRegistry();
jndi.bind("MyClientPipelineFactory", new MyClientPipelineFactory(timer));

然后将其添加到我的管道中:

public class MyClientPipelineFactory extends ClientPipelineFactory
{
  private final Timer timer;

  public MyClientPipelineFactory(Timer timer) {
    this.timer = timer;
  }

  public ChannelPipeline getPipeline(NettyProducer producer) throws Exception
  {
    ChannelPipeline p = pipeline();
    p.addLast("timeout", new ReadTimeoutHandler(timer, 30));
    // more stuff
    return p;
  }
}

最后,我在路由配置中捕获了任何异常:

onException(ReadTimeoutException.class)
   .handled(true)
   .process(new Processor() {
      public void process(Exchange exchange) throws Exception {
         Exception exception = (Exception) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
         throw new ApplicationException("Connection timed out", exception);
      }
   });

这几乎可行。不幸的是,它是特定于渠道的,而不是具体要求。所以只要我与服务器通信,我就没事了。但是在我完成后30秒,我被抛出ReadTimeoutException。问题在于它正在寻找线路上的任何活动,而不是我关心的请求/响应对。

我在这里遗漏了什么吗?是否存在使用Camel + Netty执行请求超时的固有方法,或者是否有某种方法可以使ReadTimeoutException工作?

(Camel 2.9.2 / Netty 3.3.1)

2 个答案:

答案 0 :(得分:1)

我不熟悉Camel,但是快速浏览一下Mina和Netty组件表明所需的功能是Mina组件的一个功能,而不是Mina,并且它在Netty组件中缺失。在camel trunk中,Mina生成器有一个代码路径,用于何时sync为true,而Netty生成器似乎没有类似的功能。将这个问题提交给骆驼邮件列表可能是值得的。

一种可能的解决方法是创建一个支持请求/响应的自定义Netty处理程序,因此您在管道中有一个处理程序,它在发送请求时启动计时器,并在收到响应时取消计时器。

答案 1 :(得分:0)

我想知道我们是否可以为此添加某种支持。触发给定交换请求/回复对的超时。

我假设ReadTimeoutHandler来自Netty?我想我们可以在代码中达到峰值,看看我们是否只能在有“飞行中”交换时触发它。

如果回复稍后回复,并且已经触发了超时,那么技巧也是如何处理的。然后Camel需要处理这个以取消处理回复。我不确定这是否容易。