1

我有一个 bean 生产者和一个 bean 消费者,在一条路线中使用。生产者是通过一个线程产生的,并在 hazelcast 队列上侦听数据(它可以是其他任何东西,我相信甚至可以是本地随机生成的数据)。

数据被发送到 seda 端点,以确保并发。消费者获取数据并将其转发到另一个 hazelcast 队列。但同样,它可能是其他任何东西。

它运行良好,但一段时间后,骆驼关闭,我找不到原因。

以下是我看到的一些消息:

处理大量数据...

[                          main] MainSupport                    INFO  Apache Camel 2.10.3 stopping
[                          main] DefaultCamelContext            INFO  Apache Camel 2.10.3 (CamelContext: camel-1) is shutting down
[                          main] DefaultShutdownStrategy        INFO  Starting to graceful shutdown 1 routes (timeout 300 seconds)
[el-1) thread #2 - ShutdownTask] DefaultShutdownStrategy        INFO  Waiting as there are still 1 inflight and pending exchanges to complete, timeout in 300 seconds.

然后在 300 秒内继续处理并停止。

这里有一些代码:

制片人:

   public void run()
    {
        try
        {
            IRequest service = ProxyHelper.createProxy(context.getEndpoint("seda:echo"), IRequest.class);

            BlockingQueue<Request> q = client.getQueue(MainApp.sQueueReceive);

            while(true)
            {
                Request request;
                request = q.take();
                // no response awaited
                service.request(request);
            }
        }

消费者:

   public void onMessage(Request request)
    {
        nb_forwarded++;
        BlockingQueue<Request> q = MainApp.client.getQueue(MainApp.sQueueForward);
        try
        {
            q.put(request);
        }
        catch (InterruptedException e)
        {
            exit(2);  --> it does not happen
        }

最后,路线:

from("seda:echo")
.setExchangePattern(ExchangePattern.InOnly)
.bean(new HazelcastForwarder(), "onMessage");

它在 InOnly 中,因为没有等待生产者的响应,它只是一个转发。

那么为什么骆驼会停下来。那些说它正在停止的人没有任何消息。Camel 中是否存在这样的默认行为。在哪些情况下?

谢谢!

4

2 回答 2

1

启用 DEBUG 或 Trace 日志记录来揭示骆驼停止的真正原因。可能是封闭容器正在停止(如果您在某物内运行骆驼)或类似情况。

于 2013-01-30T09:38:54.350 回答
0

我遇到了类似的问题,Camel Context 在启动过程后立即关闭。我在这里发帖,以便它也可以帮助其他有类似问题的人。

就我而言,我使用 Spring 使用“ FileSystemXmlApplicationContext ”加载 Camel 上下文并在 try 块中对其进行实例化,

try(AbstractXmlApplicationContext appContext = new FileSystemXmlApplicationContext(camelContextPath)) {

} 

因为我的 Eclipse 抱怨资源泄漏。因此,一旦调用来自 try/catch,它就会关闭 Spring 上下文,这又会关闭 Camel 上下文。

要解决此问题,需要在 try 块之外初始化 Spring 上下文。

AbstractXmlApplicationContext appContext = null;
try {
    appContext = new FileSystemXmlApplicationContext(camelContextPath);

}
于 2016-07-12T06:58:06.300 回答