2016-04-15 6 views
1

Camel Context Componentでエンドポイントにメッセージを送信したときに、確認応答付きの応答メッセージを待たなければなりません。タイムアウト時間内に応答が受信されない場合、例外はキャメルルートに戻されます。Apache Camel:SEDAエンドポイントで例外を送信する方法は?

私は次のように実装しようとしました: 元のメッセージがエンドポイントに送信されている間、タイムアウト応答を生成するためにマルチキャストを使用しました。タイムアウト応答が遅れ、このタイムアウト後に応答がない場合、タイムアウト例外がルートに戻されます。

だから私は、次のルートを持っている:

private final String internalRespUri = "direct:internal_resp"; 
private final String internalRespTimeout = "seda:internaltimeout"; 

@Override 
public void configure() { 
    SendController send_controller = new SendController(); 
    TimeoutResponse resp = new TimeoutResponse(); 

    from(Endpoints.MESSAGE_IN.direct()) 
        .errorHandler(noErrorHandler()) 
        .routeId(Endpoints.MESSAGE_IN.atsm()) 
        .log("Incoming message at segment in") 
        .process(send_controller) 
        .log("Message after send controller") 
        .multicast().parallelProcessing() 
        .log("After wiretap") 
        .to(internalRespTimeout, Endpoints.SEGMENT_OUT.direct()); 
    from(internalRespTimeout) 
        .errorHandler(noErrorHandler()) 
        .routeId(internalRespTimeout) 
        .log("begin response route") 
        .log("timeout response route") 
        .process(resp) 
        .log("modify message to response") 
        .delay(1000) 
        .log("after delay") 
        .to(internalRespUri); 
    from(Endpoints.SEGMENT_IN.seda()) 
        .routeId(Endpoints.SEGMENT_IN.atsm()) 
        .to(internalRespUri); 
    from(internalRespUri) 
        .errorHandler(noErrorHandler()) 
        .routeId(internalRespUri) 
        .log("after response gathering point") 
        .choice() 
        .when(header(HeaderKeys.TYPE.key()).isEqualTo(UserMessageType.RESP.toString())) 
        .log("process responses") 
        .process(send_controller) 
        .otherwise() 
        .log("no response") 
        .to(Endpoints.MESSAGE_OUT.direct()); 
} 

問題がSendControllerにスローされた例外は、SEDAエンドポイントinternalRespTimeoutを介して伝播されていないということです。 エンドポイントEndpoints.SEGMENT_IN.seda()からの受信した応答メッセージが送信されない間に遅延がルートをブロックします。

SEDAエンドポイントは一般に例外を伝播できませんか? 問題を解決するにはどうすればよいですか?

おかげで、 スヴェン

答えて

0

は、私がアイデアを持っている:

代わりに例外をスローするの、私はおそらく、タイムアウトのためにトランザクションを使用することができます。

これは機能しますか?

0

私は現在、ラクダのSEDAエンドポイントを伝播して例外を戻す方法を認識していません。エラー処理の仕方は、エンドポイント間のチャネルに基づいています。 SEDAエンドポイントを使用する場合、コードは処理を継続し、処理を続けるのでコードを待たないでください。私はあなたが達成したいことを理解するのに少し苦労していますが、あなたが使用できるかもしれない同様の選択肢を列挙します。

- まず、ルートレベルのエラーハンドラをSEDAベースのルートで使用し、後でルックアップできる一意のIDを使用して例外を保存します。

-第2は、あなたがやっていることを完全に制御できるJava Beanにデータを渡すことです。他のタスクを実行しながらGuavaのFuturesを使って非同期にコードを実行するようなことも考えられます。

あなたが少し上手く達成しようとしていることを説明できれば、私はより明確な提案をすることができます。

+0

達成しようとしているのは、私の会社の内部プロトコルをCamel Context Componentに実装して、さまざまなアプリケーションでライブラリとして使用することです。その後、4つのエンドポイントを持つBlackboxとして使用できます。 – Sven

+0

メッセージをプロトコルでパックする場合、各メッセージはエンドポイントEndpoints.MESSAGE_IN.direct()に送信されます。コンテキストコンポーネントでは、プロトコルがメッセージをセグメントに分割し、Endpoints.SEGMENT_OUT.direct()経由で送信します。セグメントが相手から受信されると、ステータスコードcodes.via Endpoints.SEGMENT_IN.direct()を持つ応答メッセージが返されます。 次に、相手から応答がない場合は、ステータスコードとタイムアウト動作を解釈します。 – Sven

+0

問題が発生した場合、エラーが返されなかった場合、またはエラー応答が受信された場合、どのように例外を返すのですか?エンドポイントEndpoints.MESSAGE_IN.direct()の呼び出し元へのルートにITを伝播する必要があります。元のメッセージがすでに送信されているので、ラクダは例外についてどのように対応するのか、どこに伝えるべきかを知らない。 – Sven

関連する問題