我正在使用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”路由?
答案 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可用于处理队列完整错误。