1

単一のルートで使用される Bean プロデューサーと Bean コンシューマーがあります。プロデューサーはスレッドを介して生成され、hazelcast キューでデータをリッスンします (ローカルでランダムに生成されたデータであっても、他のものである可能性があります)。

並行性を確保するために、データは seda エンドポイントに送信されます。コンシューマーはデータを取得し、それを別の hazelcast キューに転送します。しかし、それは他の何かかもしれません。

うまく機能しますが、しばらくすると Camel がシャットダウンし、原因がわかりません。

表示されるメッセージの一部を次に示します。

大量のデータを処理しています...

[                          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 は停止しているのでしょうか。停止していると言っている人からのメッセージはありません。Camel にそのようなデフォルトの動作はありますか。どのような場合に?

ありがとう!

4

2 に答える 2

1

DEBUG または Trace ログを有効にして、camel が停止している本当の理由を明らかにします。囲んでいるコンテナーが停止している可能性があります (何かの中でキャメルを実行している場合) または同様の可能性があります。

于 2013-01-30T09:38:54.350 に答える
0

プロセスを開始した直後にキャメルコンテキストが閉じているという同様の問題に直面していました。同様の問題を抱えている他の人にも役立つように、ここに投稿しています。

私の場合、「FileSystemXmlApplicationContext」を使用して Camel コンテキストをロードし、try ブロックでインスタンス化するために Spring を使用しています。

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 に答える