2012-05-11 5 views
3

ハンギング:呼び出しが正常に動作しますが、いくつかの後私は次のようなコードを使用してルートを駆動するのActiveMQを呼び出すためのApacheキャメルを使用してのApache ServiceMixの上に配備Webサービス持ってActiveMQのトランスポートと接続スレッド

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) 

やアイデア?

+0

接続プールを使用していますか?並行して実行されているクライアントの数はいくつですか?問題の詳細を伝えることができればうれしいでしょう。 – Buchi

+0

私は、接続プーリングを有効にして、本当に問題ではない無効にしようとしました。問題は「呼び出し」に結びついています。すべての呼び出しは、いくつかの "ハングする"スレッドを残します。私はちょうど数回(シリアル)のWebサービスを呼び出すことによってそれを再現することができます。 また、ここで説明するように接続用にsoTimeoutを有効にしようとしました:http://activemq.apache.org/tcp-transport-reference.html。もちろんそれは効果がありませんでした。 –

+0

通信の最後にクライアントが切断を送信しますか?あなたはプロデューサーだけを作っているのですか、あるいは消費者もいますか? – Buchi

答えて

1

私は、ProducerTemplateとConsumerTemplateのすべての使用を削除することで、漏れスレッドの問題を取り除くことができました。

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

+0

本当に他の人に役立つだろう、この問題の詳細をお知らせください。 – Santosh

2

このFAQ http://camel.apache.org/why-does-camel-use-too-many-threads-with-producertemplate.html

あなたはすべてのメッセージ送信に新しいプロデューサーのテンプレートを作成することはできませんを参照してください。そして、そうしたら、使用後に閉じてください。

+1

実際に私は間違いを犯しましたが、オリジナルの質問に対する回答の1つ(ProducerTemplateとConsumerTemplateが1つだけ作成されるように)を変更しても、作成されるスレッドの数には何の影響もありませんでした。 –

関連する問題