Click here to monitor SSC
SQLServerCentral is supported by Red Gate Software Ltd.
 
Log in  ::  Register  ::  Not logged in
 
 
 

MSMQ COM Object Programming in Visual Basic

By Jon Winer,

Programming with MSMQ
	Using the COM interface of the MSMQ object can be a bit confusing, but once you're exposed to it,
it is relatively easy to work with.  One step to keep in mind is setting up the Message Queue Server.
I won't address the specifics here (information for MSMQ setup can be found in the Windows 2000 help files), 
but there are some helpful pointers to remember when reading and writing to the queue that I will address.

	The Message queue best runs when installed on the Primary Domain Controller.  There are other options,
but I have not experimented with them yet.  Once the queue is setup, there is little maintainance.  There
are several options that may be catered to your needs, but the default ones should suffice.  If you are
not going to run your application on the PDC, you need to have an independent or dependent client setup on 
your machine.  One feature that cannot be used on a dependent client is the use of transactional queues.  
If you are running your application on a dependent client, you may only use non-transactional queues.

	Creating the queue is simple (View code below).  One thing that might throw you for a loop is if your 
queue already exists when you try to create it.  The .Create method of the MSMQ.MSMQQueueInfo object 
does not have a parameter to overwrite the existing queue or leave it alone and proceed, it will raise an 
error if the queue already exists.  You simply just handle the error (which is referenced below) and proceed.

	Opening the queue for sending is straight forward, but when opening the queue for receive access, 
you must use a share mode of MQ_DENY_NONE.  Any other share mode will not work.  Another tip when opening
a queue for receive access is to use the ReceiveCurrent method and not the Receive method.  MSMQ uses
uses a cursor to keep track of the current message.  The ReceiveCurrent takes advantage of this and it
helps to prevent possible errors.

	One method that is not available to the MSMQ COM object is purging.  Purging can only be done manually
from within the MSMQ application or via an API call: 

	 Declare Function MQPurgeQueue Lib "mqrt.dll" (ByVal hQueue As Long) As Long
	 
The constants used in this example are readily available in VB's Object Browser.
			
Public Sub MSMQExample

On Error GoTo ErrorHandler

'QueueInfo object
Dim qInfo As MSMQ.MSMQQueueInfo
'Queue object
Dim qQueue As MSMQ.MSMQQueue
'Message object
Dim qmessage As MSMQ.MSMQMessage
Dim lBody As Long

Set qInfo = New MSMQ.MSMQQueueInfo

'Creating the queue
-------------------

'create queue
With qInfo
    .PathName = Server\Queue Name
    .Label = Queue Label
    'Creates an non-transactional, universally readable queue
    'If the queue already exists, you will need to handle the error (see ErrorHandler below)
    Call .Create(False, True)
End With

'Populating the queue
---------------------

'Code for Declaring and Opening a recordset
'
'
'

'open queue with send access
Set qQueue = qInfo.Open(MQ_SEND_ACCESS, MQ_DENY_NONE)
If qQueue.IsOpen Then
    Do Until rs.EOF
        lBody = CLng(rs.Fields("EmployerID").Value)
        'create message
        Set qmessage = New MSMQ.MSMQMessage
        'assign body of message
        qmessage.Body = CLng(lBody)
        'sending the message to the queue
        qmessage.Send qQueue
        'destroy message
        Set qmessage = Nothing
        'get next record
        rs.MoveNext
    Loop
    'close queue
    qQueue.Close
End If

'Code for Closing and Destroying a recordset
'
'
'

'Reading messages from the queue
--------------------------------

'Open Queue with receive access
Set qQueue = qInfo.Open(MQ_RECEIVE_ACCESS, MQ_DENY_NONE)

If qQueue.IsOpen Then
    'get first message from queue
    Set qmessage = qQueue.ReceiveCurrent(MQ_NO_TRANSACTION, , , receivetimeout:=20)
    Do Until qmessage Is Nothing
          'get contents of message
          lBody = qmessage.Body
	  'Process message body data here
	  '
	  '
	  '
	  'destroy message
	  Set qmessage = Nothing
	  'get next message from queue
          Set qmessage = qQueue.ReceiveCurrent(MQ_NO_TRANSACTION, , , receivetimeout:=20)
    Loop
    'close queue
    qQueue.Close
End If

'cleanup
Set qQueue = Nothing
set qInfo = Nothing

Exit Sub

ErrorHandler:

If Err.Number = MQ_ERROR_QUEUE_EXISTS Then
    Err.Clear
    'queue already exists
    Resume Next
End If
			
Total article views: 4641 | Views in the last 30 days: 0
 
Related Articles
FORUM

Service Broker, Detecting Disabled Queues

I need to know when queue is diabled (poison message or otherwise) but am getting an error when I cr...

FORUM

How to receive a Message from a MSMQ using Message Queue task with out message label as "String Message"

Receive message from a MSMQ using message queue task with lable other than "String Message".

FORUM

SQL server Service Broker -- Reading same Message by multiple Users in the queue

SQL server Service Broker -- Reading same Message by multiple Users in the queue

ARTICLE

An AlwaysOn Bug with Service Broker Transmission Queue

Paul Brewer talks about an AlwaysOn problem affecting the Service Broker Transmission Queue.

ARTICLE

Message Queues in Software

Steve Jones talks about Service Broker and messaging and how these techniques can help you build a m...

Tags
 
Contribute

Join the most active online SQL Server Community

SQL knowledge, delivered daily, free:

Email address:  

You make SSC a better place

As a member of SQLServerCentral, you get free access to loads of fresh content: thousands of articles and SQL scripts, a library of free eBooks, a weekly database news roundup, a great Q & A platform… And it’s our huge, buzzing community of SQL Server Professionals that makes it such a success.

Join us!

Steve Jones
Editor, SQLServerCentral.com

Already a member? Jump in:

Email address:   Password:   Remember me: Forgotten your password?
Steve Jones