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エンドポイントは一般に例外を伝播できませんか? 問題を解決するにはどうすればよいですか?
おかげで、 スヴェン
達成しようとしているのは、私の会社の内部プロトコルをCamel Context Componentに実装して、さまざまなアプリケーションでライブラリとして使用することです。その後、4つのエンドポイントを持つBlackboxとして使用できます。 – Sven
メッセージをプロトコルでパックする場合、各メッセージはエンドポイントEndpoints.MESSAGE_IN.direct()に送信されます。コンテキストコンポーネントでは、プロトコルがメッセージをセグメントに分割し、Endpoints.SEGMENT_OUT.direct()経由で送信します。セグメントが相手から受信されると、ステータスコードcodes.via Endpoints.SEGMENT_IN.direct()を持つ応答メッセージが返されます。 次に、相手から応答がない場合は、ステータスコードとタイムアウト動作を解釈します。 – Sven
問題が発生した場合、エラーが返されなかった場合、またはエラー応答が受信された場合、どのように例外を返すのですか?エンドポイントEndpoints.MESSAGE_IN.direct()の呼び出し元へのルートにITを伝播する必要があります。元のメッセージがすでに送信されているので、ラクダは例外についてどのように対応するのか、どこに伝えるべきかを知らない。 – Sven