2014-12-22 5 views
1

ActiveMQ-5.10 사용.브로커를 다시 시작한 후 가입자가 영원히 연결할 수 없습니다.

브로커를 다시 시작한 후 클라이언트가 복구되지 않고 영원히 침을 뱉지 않는 것처럼 보입니다. 클라이언트가

[2014-12-18 18 : 17 : 58,852 [StatsCollector-3] jmx.TCAQueueSizeMonitor.getPendingQueueSize (68) 오류 : TCA 대기열 크기 상태를 가져 오는 중 예외가 발생했습니다. javax.jms.IllegalStateException는 : 세션이

at org.apache.activemq.ActiveMQSession.checkClosed(ActiveMQSession.java:767) 
    at org.apache.activemq.ActiveMQSession.createBrowser(ActiveMQSession.java:1425) 
    at org.apache.activemq.jms.pool.PooledSession.createBrowser(PooledSession.java:294) 
    at moss.jmx.TCAQueueSizeMonitor.getPendingQueueSize(TCAQueueSizeMonitor.java:63) 
    at moss.jmx.TCAQueueSizeMonitor.getTCAQueueSizeStatus(TCAQueueSizeMonitor.java:101) 
    at moss.jmx.TCAHeartBeatStatsCollector.run(TCAHeartBeatStatsCollector.java:60) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
닫혀

예외가 계속되어, 아래의 세션은 이후에 한번 그리고 폐쇄 :

[2014년 12월 19일 00 : 00 : 06176 [ securityEventDataSubscriberContainer-4105] listener.DefaultMessageListenerContainer.handleListenerSetupFailure() : 842 WARN] : 목적지 'topic : //check.newSecurityPublish'- JMS 메시지 리스너 호출자 설정이 실패했습니다. 원인 : org.apache.activemq.ConnectionFailedException 다음 JMS 연결 실패 : 연결이 거절

[2014년 12월 19일 00 : 00 : 06476 [securityEventDataSubscriberContainer-4105] listener.DefaultMessageListenerContainer.refreshConnectionUntilSuccessful() : 891 INFO] JMS 연결을 성공적으로 새로 고침했습니다.

한 클라이언트에 대해서만 볼 수 있으며 너무 가끔 나타납니다. 다른 클라이언트는 브로커와 제대로 통신 할 수 있습니다.

덕분에, 아누 즈

답변

-1

는 일반적으로 클라이언트 라이브러리는 브로커에 자동 재 연결 옵션을 구현하지 않습니다. 나는 ActiveMQ으로 일한 적이 없지만 ActiveMQ와 유사한 작업을 수행하는 다른 서버 인 RabbitMQ과 좋은 경험이 있습니다. 내가 C#에서 서버 연결을 처리하는 코드를 작성했습니다.

C#과 Java는 비슷한 동작을하므로 java에서 쉽게 구현할 수 있습니다.

  1. 주 while 루프에서는 연결 끊기 예외를 별도로 처리하고 처리합니다.
  2. 예외 처리 부분에서 서버로 다시 연결하고 네트워크 소켓 및 세션 개체를 업데이트하려고하는 곳이므로 프로그램을 평소와 같이 재개 할 수 있습니다.
  3. 오류가 발생하여 프로그램을 종료 한 후 미리 정의 된 횟수만큼 다시 시도하는지 확인하십시오. 서버가 실제로 죽었을 수도 있습니다.
  4. 브로커에 연결하려고하면 처음으로 연결 재 연결 부분을 재사용 할 수 있습니다.
  5. 이 기능을 더 잘 구현하려면 비동기 메서드 (비 차단 함수 호출)를 사용할 수 있습니다. C#에서는 위임 및 비동기 호출을 사용하여이 작업을 수행 할 수 있습니다.

희망이 있으면 문제를 해결하는 데 도움이됩니다. Java에 대한 노출이 많지 않으므로 코드 샘플을 제공 할 수 없습니다.

+0

ActiveMQ와 RabbitMQ는 동일하지 않으므로 하나의 경험이 다른 것과 관련이있는 것은 아닙니다. ActiveMQ에는 RabbitMQ에서 이러한 기능을 사용할 수없는 경우에도 손실 된 연결을 자동으로 다시 시도하는 장애 조치 전송 기능이 있습니다. – Tim

+0

@Tim 주석 주셔서 감사합니다. 장애 조치 전송은 흥미 롭습니다.제가 확인하겠습니다. –

관련 문제