0
websphere 버전 9를 사용 중이며 서브 스크립 션을위한 샘플 프로그램을 사용하여 주제를 등록합니다. 다음은 내 코드입니다. 샘플에 작업 단원을 도입했습니다.IBM Websphere MQ - MQGET이 대기열에서 메시지를 제거하지 않습니다.
문제는 다음과 같습니다. - 각 MQGET 및 커밋 후에 대기열의 메시지가 지워지지 않습니다.
의견이 있으십니까? 대기열이 만들어진 방식과 관련이 있습니까? 영구, 내구성 등 ..?
MQSUB(Hcon, /* connection handle */
&sd, /* object descriptor for queue */
&Hobj, /* object handle (output) */
&Hsub, /* object handle (output) */
&S_CompCode, /* completion code */
&Reason); /* reason code */
CompCode = S_CompCode; /* use MQOPEN result for initial test */
gmo.Options = MQGMO_WAIT /* wait for new messages */
| MQGMO_SYNCPOINT /* transaction */
| MQGMO_CONVERT; /* convert if necessary */
gmo.WaitInterval = MQWI_UNLIMITED;
while (CompCode != MQCC_FAILED)
{
buflen = sizeof(buffer) - 1; /* buffer size available for GET */
memcpy(md.MsgId, MQMI_NONE, sizeof(md.MsgId));
memcpy(md.CorrelId, MQCI_NONE, sizeof(md.CorrelId));
md.Encoding = MQENC_NATIVE;
md.CodedCharSetId = MQCCSI_Q_MGR;
/************************************************************************/
/* Start a unit of work */
/************************************************************************/
MQBEGIN (Hcon, &bo, &CompCode, &Reason);
MQGET(Hcon, /* connection handle */
Hobj, /* object handle */
&md, /* message descriptor */
&gmo, /* get message options */
buflen, /* buffer length */
buffer, /* message buffer */
&messlen, /* message length */
&CompCode, /* completion code */
&Reason); /* reason code */
/****************************************************************/
/* Display each message received */
/****************************************************************/
if (CompCode != MQCC_FAILED)
{
buffer[messlen] = '\0'; /* add terminator */
char* strings[] = {buffer};
bool client_commit_status = callback(strings);
if(client_commit_status){
MQCMIT(Hcon, &CompCode, &Reason);
if (MQCC_OK != CompCode){
MQBACK(Hcon, &CompCode, &Reason);
}
}else{
MQBACK(Hcon, &CompCode, &Reason);
}
}
'MQCMIT()'가 (가) 호출되고 있음을 어떻게 알 수 있습니까? 'callback() '은 무엇을 반환합니까? 'MQCMIT()'가 실패하여 트랜잭션이 롤백 되었습니까? 'client_commit_status'의 값을 출력하고'MQBACK()'이 불려 갔는지를 보여주기위한 몇가지'printf()'문장은 그것을 지울 수 있습니다. – mhawke
'printf()'를 추가하고 MQCMIT가 호출되고 있음을 확인했습니다. 내가 줄 번호를 적게 게시 된 코드에서 그들을 제거했습니다. – Muthukumar
OK,'MQBACK()'이 호출되지 않았 음을 확인 했습니까? – mhawke