4

次のようなコードを使用して、Apache Camel を使用して ActiveMQ 駆動ルートを呼び出す Apache ServiceMix に Web サービスをデプロイしました。

 context.createProducerTemplate().sendBody("activemq:startComplex", xml);

呼び出しは正常に機能しますが、しばらくすると Linux マシンのファイル記述子の制限に達します。リソースは、大量 (数千) の ActiveMQ スレッドによって消費されます。jmx コンソールの下に、次のようなスレッドが多数表示されます。

Name: ActiveMQ Transport: tcp://localhost/127.0.0.1:61616
State: RUNNABLE
Total blocked: 0  Total waited: 0

Stack trace: 
 java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:129)
org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:5    0)
org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.java:589)
org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:5    8)
org.apache.activemq.transport.tcp.TcpTransport$2.read(TcpTransport.java:574)
java.io.DataInputStream.readInt(DataInputStream.java:370)
org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275)
org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:222)
org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:214)
org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:197)
java.lang.Thread.run(Thread.java:662)

Name: ActiveMQ Transport: tcp:///127.0.0.1:46420
State: RUNNABLE
Total blocked: 0  Total waited: 2

Stack trace: 
 java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:129)
org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50)
org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.java:589)
org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:58)
org.apache.activemq.transport.tcp.TcpTransport$2.read(TcpTransport.java:574)
java.io.DataInputStream.readInt(DataInputStream.java:370)
org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:275)
org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:222)
org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:214)
org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:197)
java.lang.Thread.run(Thread.java:662)

ぶら下がっているスレッドを取り除く方法のアイデアはありますか?

4

2 に答える 2

2

このFAQを参照してください http://camel.apache.org/why-does-camel-use-too-many-threads-with-producertemplate.html

メッセージを送信するたびに新しいプロデューサーテンプレートを作成しないでください。その場合は、使用後に閉じることを忘れないでください。

于 2012-05-12T14:06:00.560 に答える
2

ProducerTemplate と ConsumerTemplate の使用をすべて削除することで、スレッドのリークの問題をなんとか取り除くことができました。

現在、標準の JMS API を使用して、ActiveMQ からメッセージを送受信しています。

于 2012-05-14T11:20:24.387 に答える