如何在Camel中捕获seda队列完全异常?

时间:2014-02-07 20:14:28

标签: java apache-camel

我正在使用Camel读取JMS队列并放置在SEDA队列上,然后由一个单独的路由读取并处理。有时如果我的应用程序出现问题,我的SEDA队列就会填满,我得到:

java.lang.IllegalStateException: Queue full

这是有道理的。我想捕获这个异常,所以我可以停止订阅JMS的路由(阻止任何更多的消息进入),但我似乎无法捕获它。

这是我的路线(简化):

from("{{jms.loader.in}}") 
.setExchangePattern(ExchangePattern.InOnly)
.routeId(this.getClass().getSimpleName())
.to("seda://JmsFetchRoute_incoming);

我试图将它包围在doTry - doCatch中,但未捕获异常:

from("{{jms.loader.in}}") 
.setExchangePattern(ExchangePattern.InOnly)
.routeId(this.getClass().getSimpleName())
.doTry()
    .to("seda://JmsFetchRoute_incoming)
.doCatch(Exception.class)
    .log(LoggingLevel.ERROR, "Your queue is full!")
.end();

似乎无论我在'doCatch'块中尝试做什么,它都无法达到这一点。那么如何将'call'包装到SEDA队列中,以便我可以捕获Queue Full异常?

EDIT1

根据hveiga的回答,我也尝试用'onException'创建一个ErrorHandlingRoute并将其添加到我的上下文中,但是也没有把它拿起来:

@Override
public void configure() throws Exception {
    onException(IllegalStateException.class)
        .handled(true)
        .log(LoggingLevel.ERROR, "Exception route stopping topic route, SEDA queue full")
        .to("controlbus:route?routeId=JmsFetchRoute&action=stop")
    .end();
}

我也将它添加到我的获取路线中,仍然没有拿起它:

from("{{jms.loader.in}}") 
.setExchangePattern(ExchangePattern.InOnly)
.routeId(this.getClass().getSimpleName())
    .onException(IllegalStateException.class)
      .handled(true)
      .log(LoggingLevel.ERROR, "Topic consumer stopping route, SEDA queue full : " + this.getClass().getSimpleName())
      .to("controlbus:route?routeId="+this.getClass().getSimpleName()+"&action=stop")
    .end()
.to("seda://JmsFetchRoute_incoming);

EDIT2

根据this post,无法在单独的RouteBuilder中定义onException ...

EDIT3

仍然没有运气从同一个路由器内部获取异常,所以我给了'onException'路由一个名字,但是当在JMX中检查时,这个名字不在Camel的'routes'部分?是否需要打开配置以启用“onException”路由?

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找onException()。 camel的这个功能将捕获您指定类型的任何异常,并允许您按照您喜欢的方式处理它。您似乎想要捕获该异常并使用Control Bus组件停止路由。

这将是:

onException(IllegalStateException.class).
handled(true).
to("controlbus:route?routeId=yourRouteId&action=stop");

有关详细信息,请查看:

答案 1 :(得分:0)

这似乎已在2.13.0中修复。我无法找到错误报告,但我在2.12.3中看到的问题与hveiga相同。在2.13.0中,onException和doTry / doCatch可用于处理队列完整错误。