2017-08-16 10 views
1

私のチームはapache camelを使用して動作する(非常に単純な)サービスを提供していますが、機能的にすべてのテストはOKですが、負荷テストはサービスが時間の経過とともにメモリを消費することを示します。ヒープダンプを調べると、メモリ消費量は機内リポジトリから来ていることがわかります。ルートを介して送信されたすべての単一の交換が保持されているように見えますが、ルートが完了し交換が正常に行われた後に交換を保持する必要がある理由は特定できません。なぜキャメラはインフォメーションレポジトリ内の交換を保持していますか?

私のチームからこの問題への初期の反応は、それがメモリリークであったことですが、私はこれが当てはまるとは思わない - 思いがけないアクションがある - ガベージコレクションはそれらを破棄しようとはしません。

難しいのは、保持されていると思われるエクスチェンジの1つのコピーだけではなく、交換ライフサイクルのすべてのステップが保持されていることです。ルートは特に複雑ではありませんが、そのルートを集約して問題を誇張します。

コンポーネントを追加して、失効したエクスチェンジをインフラレポジトリから消去することを検討しましたが、それはその点を見逃していました。

Camelがこのように動作する理由を誰でも説明できますか?

+0

コードはありません?私は私のルートでこの動作を見ていない。 – Namphibian

+0

サービスのコード全体(大量のコード自体)を提供することなく、いくつかのスニペットを提供することはかなり無意味です。それは疑問ではありません - キャメルが機内交換を保持する理由は何ですか?おそらく「ラクダはいつインフォメーションレポジトリからエクスチェンジを削除しますか?」より良い質問になるでしょう... – Julian

+0

私はこの動作を見ていません。 – Namphibian

答えて

1

かなり掘り下げた後、解決策はかなり些細なものであることが判明しました。このルートは、クライアントからの要求に対する交換の追跡を簡略化するために、カスタムのexchangeIdを生成します。その結果、ルートが終了すると、Exchangeが破壊されたとき(機内のリポジトリから削除されたとき)、キー:exchangeIdのバリューマップ:リポジトリ内のExchangeにカスタムExchangeIdが含まれていません。完了した交換を取り除く。

これは、集計戦略を使用した場合の副作用のようです。これがなければ、エクスチェンジは予想どおりに削除されます。

要するに、ユーザーエラーでした...

+0

ユーザーエラーではありません。あなたの答えはCamelにexchangeIdによって索引付けされた機内リポジトリがあり、単に 'exchange.setId(" mashedPotatoes ")'を実行することができ、これがリポジトリを自動的に更新しないという事実は、フレームワークのフォールトです我々のものではない。この動作はカプセル化する必要があります。この問題によるメモリリークのため、アプリケーションがクラッシュしました。 – henry700

関連する問題