netty コンポーネントを使用して TCP 経由でリモート サーバーと通信する Camel アプリケーションがあります。サーバーはハングする傾向があるため、リクエストに構成可能なタイムアウトを追加して、応答が X 時間以内に返されない場合に例外が発生するようにしたいと考えています。
mina コンポーネントにはtimeout
パラメーターにこの機能がありますが、netty コンポーネントには対応するオプションがないようです。
私はこれを a で達成しようとしましたが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)