2017-04-19 1 views
0

안녕하세요 그들이 TCP 연결을 통해 연결하고 큐에 대한 메시지도 주제 구독을 보내드립니다 커튼 과정이다 ActiveMQ를 5.10.0 일하고, 총 최대 연결은 일부 후 약 10000ActiveMQ를 죽은 연결 문제

있습니다 사용량이 activeMQ에서 최대 연결 수가 초과되면 사용량에 직면하고 있습니다. activemq 콘솔을 통과했으며 많은 TCP 연결이 여전히 활성 상태로 활성화되어 있으며이 연결이 10000으로 pileup되고 ActiveMQ가 최대 연결 수가 초과되면 오류가 발생합니다.

왜이 연결은 영원히 상태를 유지하고 있습니까?이 연결을 없애는 방법은이 죽은 연결을 죽이거나 연결을 만료시키는 방법입니다.

감사합니다 ..! JMS 클라이언트이 (가) MQ 브로커 후 일반적인 코드로 연결하고 싶어 할 때마다

답변

1

은 다음과 같이이다 :

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

지금, 그것은 연결을 닫지 않을 경우 JMS 클라이언트 (생산자/소비자) 일단 완료 해당 JMS 클라이언트는 여전히 MQ 브로커와 연결되어 있으며 MQ 브로커와의 연결을 점유합니다. 이제는 JMS 클라이언트 코드가 "잘못되었을 수 있습니다"라는 것과 연결을 닫지 않는 것처럼 보이므로 JMS 클라이언트 코드를 확인하고 아래 에서처럼 연결을 닫아야합니다.

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

이제, 다음 JMS 클라이언트에서 메시지 리스너가있는 경우가 이러한 연결은 다음 최대 활동을 지정할 수 있습니다 잠시 후 완전히 비활성화하면 연결이 열린 상태를 유지하지만, 경우 것으로 예상하고 있다고 말했다 데 당신이 다음 자세한 내용은이 cf = new ActiveMQConnectionFactory( "tcp://localhost:61616?wireFormat=openwire&wireFormat.maxInactivityDuration=<<whatever_value_you_want>>");

읽기 this ActiveMQ를 문서처럼 작성해야 MQ 브로커와의 연결을 만들 때 이에 대한 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 : 실제로는 사용자가 웹에서 로그인 할 때 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