Partager via


MSMQQueue.Receive (Windows Embedded CE 6.0)

1/6/2010

This method retrieves the first message in the queue and removes the message from the queue when the message is read.

Syntax

HRESULT Receive( 
  VARIANT* Transaction,
  VARIANT* WantDestinationQueue, 
  VARIANT* WantBody, 
  VARIANT* ReceiveTimeout, 
  MSMQMessage** ppmsg 
);

Parameters

  • Transaction
    Optional. An MSMQTransaction object, or MQ_NO_TRANSACTION, which specifies that the call is not part of a transaction.
  • WantDestinationQueue
    Optional. The default is FALSE.

    If TRUE, MSMQMessage.DestinationQueueInfo is updated when the message is read from the queue. Setting this property to TRUE can slow the operation of the application.

  • WantBody
    Optional. The default is TRUE.

    If you do not need to retrieve the body of the message, set this property to FALSE to optimize the speed of the application.

  • ReceiveTimeout
    Optional. The default is INFINITE.

    Specifies how long (in milliseconds) Message Queuing waits for a message to arrive.

  • ppmsg
    Message.

Return Value

The following table describes the common return values.

Value Description

S_OK

Success

E_INVALIDARG

One or more arguments are invalid

E_NOTIMPL

The function contains no implementation

E_OUTOFMEMORY

Out of memory

Remarks

MSMQQueue.Receive retrieves the first message in the queue. It does not use the cursor created when the queue is opened, and should not be called when navigating the queue using the cursor.

Ee501131.collapse(en-US,WinEmbedded.60).gifReceiveTimeout parameter

Optional. If a timeout period is specified and a timeout occurs, a Null message object is returned to the application.

If a timeout period is not specified, the default value of ReceiveTimeout (INFINITE) forces the MSMQQueue.Peek call to block execution until a message arrives.

Ee501131.collapse(en-US,WinEmbedded.60).gifWantDestinationQueue and WantBody parameters

Use the WantDestinationQueue and WantBody parameters to optimize the speed of the application.

Ee501131.collapse(en-US,WinEmbedded.60).gifRetrieving Messages Synchronously

For synchronous calls, execution is stopped until a message is retrieved from the queue or the message's timeout timer expires.

Ee501131.collapse(en-US,WinEmbedded.60).gifRetrieving Messages Asynchronously

The MSMQEvent object, used to read messages asynchronously, is implemented in terms of callbacks, and is limited to 64 callbacks per process.

Internally, Message Queuing uses the WaitForMultipleObjects function, which is limited to 64 objects per process.

Ee501131.collapse(en-US,WinEmbedded.60).gifRetrieving Message in Transactions

To retrieve a message within a transaction, do one of the following:

  • Set the Transaction parameter to an MSMQTransaction object.
  • Set the Transaction parameter to a constant described in the preceding table.
  • Use the Transaction parameter's default setting (MQ_MTS_TRANSACTION).

To guarantee that no transaction will be used (for example, if you retrieve a message from a nontransactional queue within a transactional MTS component), set Transaction to MQ_NO_TRANSACTION.

Messages cannot be retrieved from remote queues within a transaction.

Message Queuing performs the following tasks when a transaction is specified.

  • In the case of a subsequent Abort, the message is returned to its original place in the queue.
  • In the case of a Commit, a positive acknowledgment message is sent to the administration queue of the sending application. The class property of the acknowledgment message is MQMSG_CLASS_ACK_RECEIVE.

Transaction objects cannot be reused after you commit to or abort the transaction.

If you release the transaction object without calling Commit or Abort, the transaction is aborted.

Ee501131.collapse(en-US,WinEmbedded.60).gifOpening queues

To retrieve messages, the queue must be opened with receive access (Access = MQ_RECEIVE_ACCESS).

Messages retrieved from a queue are also removed from the queue.

Opening a queue requires a direct connection to the computer where the queue resides. You cannot retrieve messages from a queue that resides on a computer that has no direct connection to the computer where your application is running.

Ee501131.collapse(en-US,WinEmbedded.60).gifResponding to Messages

The receiving application can determine if the sending application expects a response message by retrieving the MSMQMessage.ResponseDestination (introduced in MSMQ 3.0) or MSMQMessage.ResponseQueueInfo property when reading the message.

If the property is set to Null, the sending application is not expecting a response message.

Ee501131.collapse(en-US,WinEmbedded.60).gifMessage body type

When retrieving message, you cannot look at the type of message body included in the message. Message Queuing determines the body type based on the message's body type property. (The body type property of the messages can be accessed only with Message Queuing functions.)

If the message is sent using MQSendMessage, the following situations can occur.

  • If the body type property was not set before MQSendMessage is called, the message body is treated as an array of bytes.
  • If the body type was set to an invalid body type before MQSendMessage is called, the message can be retrieved, but an error occurs when you try to read the message body.

Ee501131.collapse(en-US,WinEmbedded.60).gifEquivalent Function

When using function calls, use MQReceiveMessage to retrieve messages in the queue. To retrieve messages using this function, set the dwAction parameter to the appropriate value.

Requirements

Header mqoai.h
Library mqoa.lib
Windows Embedded CE Windows CE .NET 4.0 and later

See Also

Reference

MSMQQueue