1

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

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

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

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

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

我正在使用 Camel 2.9.x,并且我已经尝试过死信通道和各种错误处理程序实现,(似乎)没有记录错误或警告。

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

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

提前致谢!

4

1 回答 1

2

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

如果你试图写入一个不存在的 ftp 服务器,你肯定会得到一个错误(连接被拒绝或其他)..

对于许多端点也是如此。

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

如果您需要确定某些路由正在使用您的消息,请使用“direct”而不是“seda”。你甚至可以有一些中间层来使用 seda 的特性来进行分期和直接知道有一个消费者活动的特性(如果从接收者列表发送,可能有用户输入(上帝保佑)。

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

from("direct:ep1").to("seda:ep1");
from("seda:ep1").doRealStagedStuffHere();
于 2013-07-04T10:47:02.033 回答