0

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)

4

2 に答える 2

1

私は Camel に詳しくありませんが、Mina と Netty コンポーネントをざっと見てみると、必要な機能は Mina ではなく Mina コンポーネントの機能であり、Netty コンポーネントには欠けていることがわかります。Camel Trunk では、Mina プロデューサーには sync が true の場合のコード パスがありますが、Netty プロデューサーには同様の機能がないようです。camelメーリングリストに質問する価値があるかもしれません.

考えられる回避策は、リクエスト/レスポンス対応のカスタム Netty ハンドラーを作成することです。これにより、リクエストが送信されたときにタイマーを開始し、レスポンスが受信されたときにタイマーをキャンセルするハンドラーがパイプラインに含まれます。

于 2012-10-26T08:31:40.320 に答える
0

これに何らかのサポートを追加できないかと考えています。指定された交換要求/応答ペアでタイムアウトをトリガーします。

ReadTimeoutHandler は Netty のものだと思いますか? コードをピークにして、「実行中」の交換がある場合にのみトリガーできるかどうかを確認できると思います。

トリックは、応答が後で戻ってきて、タイムアウトが既にトリガーされている場合の処理​​方法でもあります。次に、Camel はこれに対処して、返信の処理をキャンセルする必要があります。それがそんなに簡単にできるかどうかはわかりません。

于 2012-10-29T11:30:02.580 に答える