2016-12-20 1 views
2

IBM Websphere MQ 큐의 메시지를 수신하는 응용 프로그램이 있습니다. 메시지가 소비되면 응용 프로그램에서 일부 처리 논리를 수행합니다. 처리가 정상적으로 완료되면 응용 프로그램에서 메시지를 확인하고 대기열에서 제거하도록합니다. 처리하는 동안 오류가 발생하면 메시지가 대기열에 남아 있도록하고 싶습니다. 어떻게 구현 되나요? (저는 .NET API를 사용하고 있습니다) 고마워요.Websphere MQ 메시지를 수신 할 때 명시 적 ACK를 수행하는 방법은 무엇입니까?

답변

2

MQ는 단일 단계 커밋 프로토콜을 지원합니다. 메시지를 받으면 동기 점을 지정한 다음 필요에 따라 COMMIT 또는 ROLLBACK을 실행하십시오. 연결이 끊어지면 기본 동작은 ROLLBACK이고 트랜잭션을 해결하지 않고 의도적으로 프로그램이 종료되면 COMMIT으로 간주됩니다. (이것은 플랫폼에 따라 다르므로, 통상적 인 조언은 명시 적으로 COMMIT을 호출하고 클래스 소멸자가 당신을 대신하지 않는 것입니다.)

이것은 메시지가 영속적인지 아닌지 여부에 관계없이 작동합니다. 그러나 메시지의 만료가 지정되어 있고 롤백 된 후에 만료되면 다시 볼 수 없게됩니다.

물론, 프로그램이 ROLLBACK을 발행하면 메시지는 다시 정상적으로 보입니다. 왜냐하면 그 메시지는 대기열과 동일한 스폿 int와 맨 위의 FIFO 대기열로 돌아 가기 때문입니다. 메시지와 관련된 문제가 일시적이지 않으면 읽기/롤백/반복의 포이즌 메시지 루프가 발생합니다. 앱이 취소 횟수를 확인할 수 없도록하고 일부 임계 값을 초과하는 경우 예외 대기열에 메시지를 다시 대기열에 넣습니다.

JMS 또는 XMS를 사용할 때 이것은 클래스 라이브러리에 의해 수행됩니다. 입력 큐의 BOQNAMEBOQTHRESH 속성이 설정된 경우 큐의 이름은 BOQNAME입니다. 그렇지 않으면 대기열에 대기열이 재 시도됩니다. 실패한 경우 (시스템이 적절하게 보호되어야하므로) 청취자는 메시지 수신을 중지합니다.

일반적인 조언은 입니다. 항상은 취소 대기열을 지정하고 클래스가이를 사용하도록하거나 앱에서 사용하도록 코딩 할 수 있습니다.

MQAPI 참조에서 Usage Notes for MQGET을 참조하고 .Net 클래스 참조에서 MQGetMessageOptions.NET 페이지를 참조하십시오.

-1

MQ Reporting Options을 참조하십시오.

만료, 도착 확인 및 배달 확인은 수신 대기열 관리자가 응답 대기열을 통해 송신 응용 프로그램에 요청하여 보낼 수 있습니다.

긍정 및 부정 확인은 메시지 설명자에있는 관련보고 속성을 사용하는 경우 수신 응용 프로그램에서 생성 할 수도 있습니다.

예외은 요청할 수 있으며 전송 체인의 대기열 관리자가 수신 응용 프로그램에서 생성하거나 응답 큐를 통해 전송 응용 프로그램에 다시 전송할 수 있습니다.

+0

A1 유용하지만이 기능을 사용하면 승인을 통해 대기열에서 메시지가 제거되는 OP 요구 사항에 아무런 영향을 미치지 않습니다. 질문은 작업 단 위의 맥락에서 답을 논의하는 것처럼 보이지만 모든 메시지보고 옵션에는 최소한 두 개의 완전히 다른 작업 단위가 포함됩니다. –

+0

파괴적인 GET 커밋은 내 책의 ACK와 다릅니다. 전송 시스템은 다른 단계를 통해 메시지의 상태를 관리 할 수 ​​있습니다. 보낸 사람 ->받은 -> (처리 된 | 실패한) – Stavr00

+1

원할 경우 독자적인 책을 사용하십시오. JMS 스펙은 확인 응답을, 특히'Session.getAcknowledgeMode' 메쏘드가 응답이'COMMIT/ROLLBACK' 처리에서 수행된다면'Session.SESSION_TRANSACTED'를 리턴한다는 것을 확인합니다. 이는 처리 결과에 따라 메시지가 소비되거나 롤백되는 OP의 요구 사항과 완벽하게 일치합니다. COA는 메시지 소비와 상관 관계가 없으며 COD는 'GET'과 동일한 UOW에 있지 않으므로 다른 사람의 책에는 OP 요구 사항에 맞지 않습니다. –