2013-01-20 2 views
3

2 개의 메시지를 대기열에 넣을 수있는 간단한 코드가 있습니다.
1) connectionNameList를 두 개의 서버로 설정했습니다.
2)이 두 서버는 독립적이지만 "QMgr"및 "TEST.IN"과 같은 동일한 큐 관리자 및 큐가 정의되어 있습니다. 3) setClientReconnectOptions (WMQConstants.WMQ_CLIENT_RECONNECT);
    첫 번째 서버가 다운 된 경우 두 번째 서버로 메시지를 보내야합니다.
MQ JMS setClientReconnectOptions가 예상대로 작동하지 않습니까?

내가 한 테스트 :
a) 첫 번째 메시지 인 sender.send (message)를 보냅니다. 그것은 효과가 있었다.
b) 30 초간 수면. 나는 더 시도, 내가 {} {캐치를 시도 않은이 시간 동안
, 나는 종료 첫 번째 서버
c)는 다음, 제 2 메시지를 보내 완료하려고 잠 있지만, 더 나아가 즉시

를 보내지 못했습니다 } 두 번째 메시지에 대해 catch {}에서 sender.send (message)를 시도했지만 여전히 실패합니다.

내가 예상 한 것과 다른 이유가 무엇인지 알기. 귀하의 회신을 진심으로 감사드립니다.

public static void main(String[] args) throws Exception 
{ 
    MQQueueConnectionFactory cf = new MQQueueConnectionFactory(); 
    cf.setConnectionNameList("10.230.34.191(1418),10.230.34.169(1418)"); 

    cf.setQueueManager("QMgr"); 
    cf.setTransportType(WMQConstants.WMQ_CM_CLIENT); 
    cf.setClientReconnectOptions(WMQConstants.WMQ_CLIENT_RECONNECT); 
    cf.setClientReconnectTimeout(600); 

    System.out.println("connect list " + cf.getConnectionNameList()); 

    MQQueueConnection connection = (MQQueueConnection) cf 
      .createQueueConnection("mqm", "passwd"); 
    MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, 
      Session.AUTO_ACKNOWLEDGE); 
    MQQueue queue = (MQQueue) session.createQueue("queue:///TEST.IN"); 
    MQQueueSender sender = (MQQueueSender) session.createSender(queue); 

    long uniqueNumber = System.currentTimeMillis() % 1000; 
    JMSTextMessage message = (JMSTextMessage) session.createTextMessage("SimplePTP " 
      + uniqueNumber); 

    // Start the connection 
    connection.start(); 

    sender.send(message); 
    System.out.println("Sent message:\\n" + message); 

    System.out.println("sleep 30 seconds"); 
    Thread.sleep(30000); 
    uniqueNumber = System.currentTimeMillis() % 1000; 
    message = (JMSTextMessage) session.createTextMessage("SimplePTP " + uniqueNumber); 
    sender.send(message); 

    sender.close(); 
    session.close(); 
    connection.close(); 

    System.out.println("\\nSUCCESS\\n"); 
    } 

답변

3

글쎄 이것은 가장 간단한 테스트 케이스이며 잘 작동했을 것입니다. 첫 번째 큐 관리자를 어떻게 내렸습니까? -r 옵션을 사용 했습니까? -r 옵션이 없으면 큐 관리자가 endmqm 명령으로 끝날 때 클라이언트가 다시 연결되지 않습니다.

endmqm -r <qm name> 

당신이 -r 옵션을 사용하고 여전히 다음 내 제안은 다음과 같은 시도하는 것, 작동하지 않는 가정 :

재 연결에 무슨 일이 일어나고 있는지 알 수있는 예외 청취자를 설정합니다. 연결이 끊어 졌을 때 예외 리스너가 호출되고 재 연결이 성공하거나 실패 할 때까지 재 연결 시도가 시작됩니다. 예외 리스너 샘플 코드는 다음과 같습니다.

conn.setExceptionListener(new ExceptionListener() { 

    public void onException(JMSException e) { 
    System.out.print(e); 
    } 
}); 
+0

감사합니다. 실제로 "-r"을 사용하여 종료하면 실제로 작동했다고 생각합니다. IBM 문서에서 지적했듯이, 모든 종료 (shutdown) 경우에는 장애 복구 (failover)가 작동하지 않습니다. 그래서 문제가되지 않습니다. – huican

관련 문제