2017-04-19 12 views
0

こんにちは、彼らはTCP接続を介して接続し、キューへのメッセージともトピックのサブスクリプションを送信しますカーテンプロセスですActiveMQの5.10.0に取り組んでいます、合計最大接続数は、いくつかの後の周りの10000ActiveMQのデッド接続の問題

ですActiveMQで最大接続数を超えているため、使用状況にエラーがあり、activemqコンソールを経由してTCP接続の多くがアクティブ状態で有効であり、この接続が10000に達し、ActiveMQが最大接続数を超えたためエラーが発生します。

なぜこの接続は永遠に状態を維持しているのですか本当にこの接続を取り除く方法は、このデッド接続を強制終了するか、接続を一定期間後に終了する方法です。

ありがとうございました!

答えて

1

JMSクライアントは、その後、典型的なコードは次のようであるMQブローカーに接続しようとするたびに:それは接続を閉じていない場合は、JMSクライアント(プロデューサ/コンシューマ)が行われた後、今

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
connection = connectionFactory.createConnection(); 

そのJMSクライアントは引き続きMQブローカとの接続を維持し、MQブローカとの接続を占有します。あなたの場合、あなたのJMSクライアントコードが "間違いかもしれない"ように見えて、接続を閉じないので、あなたのJMSクライアントコードをチェックして、以下のように接続を閉じる必要があります。

if (connection != null) { 
     connection.close(); 
} 

は、あなたがあなたのJMSクライアントにメッセージリスナを持っているならば、接続が開いたままであろうと予想されますが、これらの接続は、いくつかの時間後に完全に不活性である場合に場合には、あなたが最大非アクティブを指定できることを言いましたあなたはMQブローカーとの接続を作成するとき、あなたがより多くの詳細については、このcf = new ActiveMQConnectionFactory( "tcp://localhost:61616?wireFormat=openwire&wireFormat.maxInactivityDuration=<<whatever_value_you_want>>");

読むthis ActiveMQのドキュメントのように作成する必要があり、このため、wireFormat.maxInactivityDurationを使用して接続のための期間。 FYIとして


- ActiveMQのブローカーに接続の最大数は、これだけでは、その内部にあなたは下記のように使用すると、最大接続(?maximumConnections=1000)で定義transportConnectors要素を有して、その設定ファイルactivemq.xmlを使用して定義されあなたが適切なシステムリソースを持っていて、より多くのクライアント接続を得る能力を持っていれば、それを増やすことができます。

<transportConnectors> 
      <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --> 
      <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
      <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
      <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
      <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
      <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
</transportConnectors> 
+0

こんにちは@ハグラウォール再生のためにありがとう、あなたは私のコードですべての接続を閉じているとチェックしていると言ったようにconnection.close(); 、case1:実際には、ユーザーがWebでログインするときに、ユーザーがログアウトしたりセッションが終了したときに閉じるべきでないTCP接続を介してトピックに登録されたときです。 – user4045063

+0

ケース2:キューにメッセージを配置するときエンドユーザーのインターネット接続が妨げられ、MQが要求された使用に応答して接続を維持できない。 activemq.xmlで任意の変更を行うことができます。これは、時間の経過後に接続を閉じることができます。 – user4045063

+0

あなたのケース1について:言及したように、明らかに問題は、ユーザーがログアウトしたとき、またはセッションが終了したときに接続を閉じる必要があることです。ケース2の場合:最大休止時間を指定できますが、同様の方法でタイムアウトパラメータを設定できます(http://activemq.apache.org/tcp-transport-reference.html)。あなたのケースを見ると、低速のコンシューマーを設定する必要があると思います。https://planet.jboss.org/post/coming_in_activemq_5_9_a_new_way_to_abort_slow_consumers – hagrawal