2009-09-01 10 views
2

간단한 JMS 애플리케이션을 AIX 서버 아래의 OC4J에 애플리케이션을 배치했습니다. 일부 대기열을 듣고 AS400 서버 아래에 배치 된 Websphere MQ의 다른 대기열로 보냅니다. .JMS를 사용하는 Websphere MQ, MQ에서 닫힌 연결 닫기

문제는 이러한 큐에 내 연결이 (이것은 문제가되지 않습니다)는 오류 MQJMS1016와 약간의 시간 동안 유휴 상태 유지시 마감/를 종료되었는지, 그리고 그렇게되면 내가 연결 복구를 시도하고 그러나 이전 연결은 MQ에서 중단되어 수동으로 종료 될 때까지 종료되지 않습니다. (MQ 측에 붙어 연결) 메시지 (즉, 그들은 메시지를 사용하지 않는) 처리 그대로, 우리가 일을 왼쪽에 영향을주지 않습니다를 고아 연결 이후

public void recover() { 
    cleanup(); 
    init(); 
} 

public void cleanup(){ 
    if (session != null) { 
     try { 
      session .close(); 
     } catch (JMSException e) { 
     } 
    } 
    if (connection != null) { 
     try { 
      connection.close(); 
     } catch (JMSException e) { 
     } 
    } 
} 

public void init(){ 
    // typical initialization of the connection, session and queue... 
} 
+0

하지만 무엇이 문제이며, "멈추지 않습니다"- session.close()에 있습니까? – nos

+0

문제는 Websphere MQ 측에서 기존 수신기/프로듀서가 작동하지 않아 추가 작업을 MQ에 연결 한 것으로 보입니다. 복구 코드가 문제없이 실행됩니다. –

답변

1

다음과 같이

복구 코드는 간다 MQ에서 허용되는 최대 연결에 도달 할 때까지

복구가 더 이상 작동하지 않아 MQ 관리자가 고아 연결을 수동으로 치료해야했지만 좋은 소식은이 특정 문제를 검색하면 IBM 지원 사이트에서보고되는 문제였습니다. :

check here

+0

참조 된 APAR은 채널을 조정하는 방법을 알려주므로 WMQ가 고아를 빨리 처리합니다. 이 방법이 도움이되지만 여전히 해결 방법 일 뿐이며 근본 원인을 수정하고 연결된 예외를 인쇄하는 대신 사용할 수는 없습니다. –

3

MQJMS1016 내부 오류입니다 및 연결 손실이 코드 또는 WMQ 자체에 문제로 인해 있음을 나타냅니다. 채널을 조정하면 도움이 될 것입니다.하지만 앱이 왜 사용 가능한 모든 채널을 사용할 수있을 정도로 빨리 연결을 끊어 버리는 지에 대한 문제를 해결해야합니다.

맨 먼저해야 할 일은 WMQ 및 실행중인 WMQ 클라이언트의 버전을 확인하는 것입니다. 이것이 새로운 개발이라면 v6의 수명이 다 끝났기 때문에 2011 년 9 월에 WMQ v7 클라이언트를 사용해야합니다. v7 클라이언트는 v6 QMgrs에서도 업그레이드 할 수있을 때까지 작동합니다. v7 클라이언트 및 QMgr에 도달하면 꽤 많은 채널 조정 및 재 연결 옵션을 사용할 수 있습니다.

WMQ V7 클라이언트 다운로드는 여기에 있습니다 : http://bit.ly/bXM0q3 또한

은, 코드의 재 연결 로직이 위의 시도 사이에 잠을하지 않습니다. 클라이언트가 높은 속도로 연결 요청을 보내면 WMQ 수신기에 과부하가 걸리고 매우 효과적인 DOS 공격이 실행될 수 있습니다. 시도하는 데 몇 초간 자도록 권장합니다.

마지막으로 JMSException catch 블록에 링크 된 예외를 인쇄하십시오. JMS 전송 제공자에 문제가있는 경우, JMS 링크 된 예외에는 저수준 오류 정보가 포함됩니다. WMQ의 경우 2035 MQRC_AUTHORIZATION_ERROR 또는 2033 MQRC_NO_MSG_AVAILABLE과 같은 이유 코드가 포함됩니다. 여기에 예제가있다 :

try { 
    . 
    . code that might throw a JMSException 
    . 
} catch (JMSException je) { 
    System.err.println("caught "+je); 
    Exception e = je.getLinkedException(); 
    if (e != null) { 
    System.err.println("linked exception: "+e); 
    } else { 
    System.err.println("No linked exception found."); 
    } 
} 

일부 밤 오전 2시에 오류가 발생하는 경우, WMQ 관리자는 링크 된 예외 주셔서 감사합니다.

+0

네트워크가 유휴 연결을 종료하도록 구성 되었기 때문에 문제가 해결되었고 링크 된 예외는 관련성이 없습니다 (단, 문제의 기록을 확인하고 더 많은 시간이있을 때 연결된 예외를 제공합니다). 연결 복구가 실제로 30 초 제한 시간에 있었고 maximum-connections-is-reached- 문제가 발생하는 데 며칠이 걸렸습니다 (원래 게시물이 제시하는 것처럼 자주 발생하지 않음) 결국 keep-alive 메시지를 보내야했습니다 우리가 시작하는 모든 연결을 통해. –

+0

그건 훌륭한 소식입니다! 가치있는 것에 대해서는 링크 된 예외 사항이 WMQ에만 국한되지 않습니다. 모든 운송 업체는 관련 정보를 제공 할 수 있습니다. 따라서 코딩 표준이되면 모든 JMS 코드를 도울 것입니다. 나는 그것없이 생산에 부호를 받아들이지 않을 많은 클라이언트가있다. 어느 쪽이든, keepalives가 지금 연결을 유지하고 있다는 것을 듣게되어 기쁘다. –

관련 문제