當我將一個Camel上下文組件中的消息發送到它的端點時,我必須等待一個帶有確認的響應消息。如果在超時時間內沒有收到響應,則應將異常投擲回駱駝路線。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上下文組件作爲庫在不同的應用程序中使用。然後,它可以用作具有4個端點的Blackbox。 – Sven
當消息與協議打包在一起時,每條消息都會發送到端點Endpoints.MESSAGE_IN.direct()。在上下文組件中,協議分段分段消息並通過Endpoints.SEGMENT_OUT.direct()發送出去。當從對方收到段時,它通過Endpoints.SEGMENT_IN.direct()發回帶有狀態碼的響應消息。 然後我解釋狀態碼和超時行爲,如果沒有收到對方的迴應。 – Sven
問題是,如果沒有或收到錯誤響應,如何發回異常? IT應該通過路由傳播給端點Endpoints.MESSAGE_IN.direct()的調用者。由於原始郵件已經發送,駱駝不知道如何對異常做出反應,以及在何處傳播它。 – Sven