2016-04-15 52 views
1

當我將一個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端點通常不能傳播異常嗎? 如何才能解決我的問題?

感謝, 斯文

回答

0

我有一個想法:

而不是拋出一個異常,我可能可以使用交易超時。

請問這項工作?

0

我目前還沒有意識到在駱駝SEDA端點上傳播和異常的方式。錯誤處理的工作方式基於端點之間的通道。當您使用SEDA端點時,代碼將繼續處理並且不會等待代碼,因爲它將繼續處理。我在理解您想要完成的任務時遇到了一些問題,但我會列出一些您可能會使用的類似備選方案。

- 第一種方法是在基於SEDA的路由中使用路由級錯誤處理程序,並使用可以稍後查找的唯一ID存儲該異常。

- 第二種方法是將數據傳遞給Java Bean,您可以完全控制自己在做什麼,甚至可以考慮使用Guava的Futures在執行其他任務時異步運行代碼。

如果你能解釋你正在努力完成的更好一點,我可能會提出更明確的建議。

+0

我想實現的是在我的公司內部協議中實現一個Camel上下文組件作爲庫在不同的應用程序中使用。然後,它可以用作具有4個端點的Blackbox。 – Sven

+0

當消息與協議打包在一起時,每條消息都會發送到端點Endpoints.MESSAGE_IN.direct()。在上下文組件中,協議分段分段消息並通過Endpoints.SEGMENT_OUT.direct()發送出去。當從對方收到段時,它通過Endpoints.SEGMENT_IN.direct()發回帶有狀態碼的響應消息。 然後我解釋狀態碼和超時行爲,如果沒有收到對方的迴應。 – Sven

+0

問題是,如果沒有或收到錯誤響應,如何發回異常? IT應該通過路由傳播給端點Endpoints.MESSAGE_IN.direct()的調用者。由於原始郵件已經發送,駱駝不知道如何對異常做出反應,以及在何處傳播它。 – Sven

相關問題