2011-11-15 15 views
0

私は深刻な問題があります。私は、複数のメッセージをnettyに送信する必要がある状況を持っています。これらのメッセージはすべて同じ場所にあるラクダによって生成され、すべての単一のメッセージに応答します。Apache Camelでnettyを使用した場合のデッドロック

コードは、そのようなものです:splitMessageクラスは、少なくとも10件のメッセージを生成し

from("direct:status") 
.split().method("splitMessage", "split").to("direct:device") 

from("direct:device") 
.to("netty:tcp://4533sync=true&decoders=#myDecoders&encoders=#myEncoders") 
.to("direct:send") 

、そうでない場合より

最初のメッセージが生成されたら、その後、ネッティーがそれを受け取ります、それが送信されます返信して転送してください。 そして、2番目のメッセージが生成され、それがnettyに送信され、問題が開始されます。私はいつもそのようなエラーが表示されます:

2011-10-14 10:27:14,326 [ent worker #1-3] ERROR DefaultErrorHandler   - Failed delivery for exchangeId: ID-Stenver-LapTop-60537-1318576334993-0-24. Exhausted after deliver y attempt: 1 caught: java.lang.IllegalStateException: await*() in I/O thread causes a dead lock or sudden performance drop. Use addListener() instead or call await*() from a differ ent thread. 
java.lang.IllegalStateException: await*() in I/O thread causes a dead lock or sudden performance drop. Use addListener() instead or call await*() from a different thread. 

を私がメッセージを遅延させることによって、問題を回避しようとしたが、それは助けをdoesntの。私はデッドロックを無効にすることでエラーを回避することができますが、実際には解決策ではありません。

誰でも手助けできますか?

答えて

0

エンコーダ/デコーダ内でChannelFuture.await(..)を呼び出しますか?もしそうでなければ、それを行うラクダ - ネティコンポーネントかもしれない。いずれにせよ、I/O-Thread内からChannelFuture.wait(..)を決して呼び出さないでください。

+0

うん。このバグを報告するには、CamelチームまたはNettyコネクターのメンテナーに連絡することをお勧めします。 – trustin

+0

私はChannelFuture.await()を呼び出していません DelimiterBasedFrameDecoder、StringDecoder、OneToOneDecoderおよびOneToOneDecoderをもう一度使用しています。 OneToOneDecodersでメソッドが行うことは、文字列で処理されています デリミタと文字列デコーダはすべてそのクラスを拡張し、その機能を呼び出します どこでこれをnettyチームに報告する必要がありますか – user1047833

関連する問題