2016-10-15 3 views
1

이하 MQ에서 정보를 가져와 DB에 저장하는 Java MQ GET 루틴을 게시했습니다.
그러나 GET과 COMMIT 사이의 연결이 끊어 질 때 문제가 발생합니다.
연결이 끊어지면 COMMIT으로 해석됩니다. 그런 다음 데이터가 손실됩니다.java 구체적인 MQ GET 및 COMMIT/BACKOUT을 구현하는 방법

콘크리트를 어떻게 구현해야합니까? & COMMIT/BACKOUT 모델 ??? 커밋되지 않은 요청이있는 동안 프로그램이 MQDISC 호출을 발행하는 경우

String hostName = "192.168.163.63"; 
int port = 1418; 
String userId = "mq"; 
String password = "mq"; 
String queueManagerName = "QueueManager1418"; 
String channelName = "ServerChannel"; 
String queueName = "TestQueue"; 

MQEnvironment.hostname = hostName; 
MQEnvironment.port = port; 
MQEnvironment.userID = userId; 
MQEnvironment.password = password; 
MQEnvironment.channel = channelName; 
try { 
    MQQueueManager qMgrIn1 = new MQQueueManager(queueManagerName); 
    int openOptionsIn1 = CMQC.MQOO_INPUT_SHARED | CMQC.MQOO_INQUIRE; 
    MQQueue queueIn1 = qMgrIn1.accessQueue(queueName, openOptionsIn1); 
    MQMessage getMessage1 = new MQMessage(); 
    MQGetMessageOptions mqGetMessageOptions1 = new MQGetMessageOptions(); 
    mqGetMessageOptions1.options = CMQC.MQGMO_SYNCPOINT; 
    queueIn1.get(getMessage1, mqGetMessageOptions1); 
    String txt1 = getMessage1.readLine(); 
    System.out.println("get1 << " + txt1); 

    //////////// make problem point like network disconnect with MQ server 
    DoSaveInfo2DB(); 
    qMgrIn1.commit(); 
    if (queueIn1 != null) 
     queueIn1.close(); 
    if (qMgrIn1 != null) 
     qMgrIn1.disconnect(); 
} catch (Exception ex) { 
    System.out.println("ex.getMessage() = " + ex.getMessage()); 
} 

는 IBM의 MQ 문서에서, 나는 RRS와 z/OS의 배치를 제외하고 울부 짖는 소리 텍스트를

을 발견, 내재적 동기 점가 발생합니다. 프로그램이 비정상적으로 종료되면 암시 적 철회가 발생합니다. z/OS에서 처음으로 MQDISC를 호출하지 않고 프로그램이 정상적으로 끝나면 암시 적 동기 점이 발생합니다. MQ에 연결된 TCB가 정상적으로 종료되면 프로그램은 정상 종료 된 것으로 간주됩니다. z/OS UNIX 시스템 서비스 및 언어 환경 (LE)에서 실행 중일 때 비정상 종료 또는 신호에 대한 기본 조건 처리가 호출됩니다. LE 조건 핸들러는 오류 조건을 처리하고 TCB는 정상적으로 종료됩니다. 이 조건 하에서 MQ는 작업 단위 (UOW)를? L 트합니다.

응용 프로그램이 이전/백 아웃을 커밋 MQ 서버 & DB (네트워크 문제)와 연결이 끊어진 경우 의미

, MQ가 자동으로 COMMIT 및 결과에서 우리가 잃어버린 !!!!

답변

2

그것은 응용 프로그램이 이전/백 아웃을 커밋 MQ 서버 & DB (네트워크 문제)와 연결이 끊어진 경우 의미, MQ가 자동으로 COMMIT 및 결과에서 우리가 잃어버린 !!!!

z/OS UNIX 시스템 서비스에서 프로그램을 실행하고 있습니까? 왜냐하면 당신이 그렇지 않다면 그것은 적용되지 않습니다. z/OS UNIX 시스템 서비스에서 실제로 응용 프로그램을 실행하는 회사는 거의 없습니다. 대개 z/OS (배치, CICS 또는 IMS) 또는 Linux on System Z입니다.

Windows 또는 Linux 또는 Unix에서 실행중인 경우 다음 두 문장 다음 AIX, HP-UX 또는 Solaris)이 적용 커밋 요청이있는 동안 프로그램이 MQDISC 호출을 발행

  • 경우, 암시 적 동기 점가 발생합니다.

  • 프로그램이 비정상적으로 종료되면 암시 적 철회가 발생합니다.

의미가 있습니까?

마지막으로 단일 단계 UOW (작업 단위)를 수행하고 있지만 2 단계 UOW를 수행해야합니다.

+0

조언 해 주셔서 감사합니다. Windows에서 앱을 실행하고 있습니다. 어떤 응용 프로그램이 종료 될 수 있는지 (커밋 및 연결 끊기 전에) (비정상적으로 끝나는) 위치를 기록한 다음 커밋되지 않은 메시지를 취소합니다. 문제는 여기 내가 자동으로 제거하려는 것입니다 (Windows에서는 ZOS가 아닐 수도 있습니다 !!!). 제가 올바르게 이해한다면, 제 2 단계 UOW 구현을위한 제 2 Trans Management가 없습니다. 어떤 조언을 해주셔서 감사드립니다. –

+0

비정상 종료의 기본 동작은 변경할 수 없습니다. 당신은 get을하고 연결이 끊어진다면 메시지가 큐에 다시 저장되므로 (나중에 처리 할 수 ​​있도록) 좋은 일임을 깨닫습니다.2 단계 UOW를 원하면 Java/MQ 확장 트랜잭션 클라이언트 (XA)를 사용하십시오. – Roger

관련 문제