Search code examples
pythonironpythonmsmq

How to create a new MSMQ message in IronPython with label, reply queue and other properties


I'm following this example here to use MS Message Queues with IronPython. The example works to create a message text string without any properties.

import clr
clr.AddReference('System.Messaging')
from System.Messaging import MessageQueue

ourQueue = '.\\private$\\myqueue'
queue = MessageQueue(ourQueue)
queue.Send('Hello from IronPython')

I am trying to create an empty message and then add properties (like label, a reply queue and a binary message body) and then send that complete message.

How can I do this in IronPython?

The documentation of the message class is here, but obviously has no python sample code. I have never used .net code with python and just installed IronPython to connect to an existing MSMQ environment, so I'm a bit stuck in how to proceed.

Any help?

update

See answer below, I managed to guess the systax to create a message. The solution seems a bit hacky so I'll leave this open for a few days

update 2

For the benefit on anyone looking for MSMQ from regular Python, you can do this via

import pythoncom
import win32com.client

If you, reading this, need more info, post a seperate question and tag me here so I see this...


Solution

  • I've started guessing the syntax by examining c# examples and have hacked a solution to the problem. The following code delivers a message with a user defined label and response queue and a body message.

    import clr
    
    from System import Array
    from System import Byte
    
    clr.AddReference('System.Messaging')
    from System.Messaging import MessageQueue
    from System.Messaging import Message
    
    ourQueue = '.\\private$\python_in'
    ourOutQueue = '.\\private$\python_out'
    
    if not MessageQueue.Exists(ourQueue):
        queue = MessageQueue.Create(ourQueue)
    else:
        queue = MessageQueue(ourQueue)
    
    if not MessageQueue.Exists(ourOutQueue):
        out_queue = MessageQueue.Create(ourOutQueue)
    else:
        out_queue = MessageQueue(ourOutQueue)
    
    mymessage = Message()
    mymessage.Label = 'MyLabel'
    mymessage.ResponseQueue = out_queue
    
    mystring = 'hello world'
    mybytearray = bytearray(mystring)
    
    # this is very hacky
    mymessage.BodyStream.Write(Array[Byte](mybytearray),0,len(mybytearray))
    
    queue.Send(mymessage)