56 lines
2.5 KiB
Plaintext
56 lines
2.5 KiB
Plaintext
Sample: mqport
|
|
|
|
Purpose:
|
|
This console app sample demonstrates how to use NT completion ports
|
|
in MSMQ in order to asynchronously receive messages in an
|
|
efficient manner. This mechanism is scalable in the number of queues
|
|
and messages by adding more processors/threads. Likewise,
|
|
generic completion port handlers can be provided to handle other NT
|
|
resources as well as queues.
|
|
|
|
Both the MSMQ COM components and the MQ API are used in this program.
|
|
Note that the COM components are used for queue creation, open and message
|
|
send. Whereas the MQ API is used to implement completion port-based
|
|
asynchronous receive.
|
|
|
|
|
|
Requirements:
|
|
VC5 is required.
|
|
MSMQ 2.0 or later must be installed -- specifically mqoa.dll must be registered and
|
|
on the path.
|
|
|
|
Project settings:
|
|
- the include path must include mq.h's location:
|
|
e.g. ...\msmq\sdk\include
|
|
- the link library path must include mqrt.lib's location:
|
|
e.g ...\msmq\sdk\lib
|
|
|
|
Overview:
|
|
The following steps comprise this sample:
|
|
- DS connection is detected and a public queue will be used on a DS enabled
|
|
computer. Otherwise a private queue will be used.
|
|
- A global MSMQQueueInfo object is used to reference the sample's
|
|
single queue.
|
|
- Initialize OLE
|
|
- Create a new completion port
|
|
- Create a bunch of threads with a generic CompletionPortThread start
|
|
routine parameterized with the completion port handle from the previous step.
|
|
- Open the queue and associate its handle with the completion port:
|
|
- note the queue is deleted and recreated if already exists
|
|
otherwise a new queue is created.
|
|
- in case the local computer is working in workgroup mode, a private
|
|
queue is created. A public queue is created otherwise.
|
|
- Enable a bunch of asynchronous message receive requests on the queue.
|
|
Since the queue is associated with the completion port, each of these
|
|
requests will result in the CompletionPortThread handler being notified
|
|
asynchronously by NT when the async receive message "completes".
|
|
- note that the NT scheduler will select the "best" available completion
|
|
port thread that is synchronously waiting for a completion notification.
|
|
- Finally, to test the completion port handlers, a bunch of messages is sent
|
|
to the queue and the program hibernates.
|
|
- To exit, just kill the console app window.
|
|
|
|
|
|
For More Information:
|
|
See the MSDN help for completion ports, especially: "Writing Scalable Applications for Windows NT"
|