The functions used to read messages in a queue journal are the same as those used to read messages in other queues. The only difference is that the format name used to open the queue journal has a special format.
wsprintf( wszFormatNameBuffer, L"%s;JOURNAL", QueueFormatName );
QUEUEHANDLE hQueue; hr= MQOpenQueue( wszFormatNameBuffer, MQ_RECEIVE_ACCESS, 0, &hQueue ); if (FAILED(hr)) { // Handle failure }
MQMSGPROPS MsgProps; MQPROPVARIANT aVariant[10]; MSGPROPID aPropId[10]; DWORD PropIdCount = 0; #define MSG_BODY_LEN 500 unsigned char ucMsgBody[MSG_BODY_LEN]; DWORD dwAppspecificIndex; // Set the PROPID_M_BODY property. aPropId[PropIdCount] = PROPID_M_BODY; //PropId aVariant[PropIdCount].vt = VT_VECTOR|VT_UI1; //Type aVariant[PropIdCount].caub.cElems = MSG_BODY_LEN; //Value aVariant[PropIdCount].caub.pElems = ucMsgBody; PropIdCount++; // Set the MQMSGPROPS structure MsgProps.cProp = PropIdCount; //Number of properties. MsgProps.aPropID = aPropId; //Ids of properties. MsgProps.aPropVar = aVariant; //Values of properties. MsgProps.aStatus = NULL; //No Error report.
hr = MQReceiveMessage( hQueue, // handle to the Queue. 5 * 60 * 1000, // Max time (msec) to wait for msg. MQ_ACTION_RECEIVE, // Action. &MsgProps, // properties to retrieve. NULL, // No overlapped structure. NULL, // No callback function. NULL, // NO cursor. NULL // No transaction. );
This example reads the first message in the queue journal. It takes the queue's identifier (GUID), translates it into a string and, prepares the format name of the queue using the translated string, then opens the queue and reads the first message.
HRESULT hr; #define FORMAT_NAME_LEN 80 WCHAR wszFormatNameBuffer[ FORMAT_NAME_LEN]; DWORD dwFormatLen = FORMAT_NAME_LEN; wsprintf( wszFormatNameBuffer, L"%s;JOURNAL", QueueFormatName ); /////////////////////////////////// // Open queue with receive access. /////////////////////////////////// QUEUEHANDLE hQueue; hr= MQOpenQueue( wszFormatNameBuffer, MQ_RECEIVE_ACCESS, 0, &hQueue ); if (FAILED(hr)) { // Handle failure } /////////////////////////////////// // Specify the message properties // you want to receive. /////////////////////////////////// MQMSGPROPS MsgProps; MQPROPVARIANT aVariant[10]; MSGPROPID aPropId[10]; DWORD PropIdCount = 0; #define MSG_BODY_LEN 500 unsigned char ucMsgBody[MSG_BODY_LEN]; DWORD dwAppspecificIndex; // Set the PROPID_M_BODY property. aPropId[PropIdCount] = PROPID_M_BODY; //PropId aVariant[PropIdCount].vt = VT_VECTOR|VT_UI1; //Type aVariant[PropIdCount].caub.cElems = MSG_BODY_LEN; //Value aVariant[PropIdCount].caub.pElems = ucMsgBody; PropIdCount++; // Set the MQMSGPROPS structure MsgProps.cProp = PropIdCount; //Number of properties. MsgProps.aPropID = aPropId; //Ids of properties. MsgProps.aPropVar = aVariant; //Values of properties. MsgProps.aStatus = NULL; //No Error report. ////////////////////////// // Read a message. ////////////////////////// hr = MQReceiveMessage( hQueue, // handle to the Queue. 5 * 60 * 1000, // Max time (msec) to wait for msg. MQ_ACTION_RECEIVE, // Action. &MsgProps, // properties to retrieve. NULL, // No overlapped structure. NULL, // No callback function. NULL, // NO cursor. NULL // No transaction. ); if (FAILED(hr)) { //Handle failure }