在Apache Camel中,如果端点不存在,如何收到错误?

时间:2013-07-03 20:09:13

标签: java apache-camel enterprise-integration

我们正在使用Camel流利的构建器来设置一系列复杂路由,我们在其中使用RecipientList功能进行动态路由。

我们遇到过以下问题:在某些情况下,收件人列表包含不存在的消息传递端点(例如,seda:notThere)。

一个简单的例子是这样的:

from("seda:SomeSource")....to("seda:notThere");

如何配置路由,以便在交换机尝试路由到尚不存在的端点时,会引发错误?

我正在使用Camel 2.9.x,我已经尝试了Dead Letter Channel和各种Error Handler实现,(似乎没有)记录错误或警告。

我看到的唯一日志记录表明Camel正在(尝试)发送到不存在的端点:

2013-07-03 16:07:08,030|main|DEBUG|o.a.c.p.SendProcessor|>>>> Endpoint[seda://notThere] Exchange[Message: x.y.Z@293b9fae]

提前致谢!

1 个答案:

答案 0 :(得分:1)

在这种情况下,所有端点的行为都不同。

如果您尝试写入不存在的ftp服务器,您肯定会收到错误(连接被拒绝或其他方式)..

对于许多端点也是如此。

如果SEDA队列不存在,则会创建SEDA队列,并且消息将保留在那里。因此,您的路由实际上发送到“notThere”,并且消息仍将存在,直到应用程序重新启动或有人开始使用来自seda的消息:notThere。这就是seda队列的设计方式。如果你将seda队列的大小设置为(“seda:notThere?size = 100”),那么如果没有人阅读(或缓慢阅读),你将获得消息101和转发的例外。

如果您需要确定某些路线正在消耗您的信息,请使用“直接”代替“seda”。你甚至可以让一些中间层使用seda的功能来进行分段和直接知道有消费者活动的功能(如果从收件人列表中发送,可能还有用户输入(上帝保佑)。

from("whatever").recipentList( ... ); // "direct:ep1" work, "direct:ep2" throws exception

from("direct:ep1").to("seda:ep1");
from("seda:ep1").doRealStagedStuffHere();