2016-04-15 54 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

相关问题