0

私は Apache camel を使用する初心者ですが、さまざまなテストから、JMS をキュー チャネルとして使用するとメモリ リークが発生することがわかりました。これは、各メッセージの消費後に使用メモリが減らないためです。

簡単な例はそれをよりよく説明します:

public static void main(String args[]) throws Exception {
    CamelContext context = new DefaultCamelContext();
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
    context.addComponent("experimental", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from("file://test").to("experimental:queue:test");
        }
    });
    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from("experimental:queue:test").to("stream:out");
        }
    });
    Main main = new Main();
    main.getCamelContexts().add(context);
    main.run();
}

GC に強制的にキューを消去させたり、その内容をオンデマンドでフラッシュさせたりする方法はありますか? そのようなソリューションに Camel を使用するより良い方法はありますか?

乾杯!

4

2 に答える 2

4

現在、vmプロトコルでactivemqを使用しているため、プロセス内にブローカーが作成されます。外部のactivemqブローカーを使用してみてください。この場合、メモリリークがない場合、問題はactivemqにあります。とにかく、vmプロトコルは主にテスト用です。

于 2012-07-19T15:29:48.520 に答える
2

ActiveMQコンポーネントにメモリリークがあった場合、私は驚きます。これは非常に一般的に使用されるコンポーネントであるため、何年も前に発見されていたでしょう。

私はクリスチャンのアドバイスを受けて、実際にはVMの代わりにアクティブMQを使用しますが、file:// testエンドポイントをdirect:testのようなものに置き換え、コンテキストを開始した後、プロデューサーテンプレートを作成し、ルートを氾濫させますメッセージ付き:

ProducerTemplate template = context.createProducerTemplate();
long msgNumber = 1;
while (true) {

   template.sendBody("direct:test", "message number " + msgNumber);
   msgNumber++;

}

それがすぐにクラッシュしない場合は、gcがその仕事をしている可能性があります。確かにプロファイラーで実行できます。

于 2012-07-19T18:48:15.097 に答える