倪港钧
倪港钧

Reputation: 1

How to use Python to send messages to MSMQ with transaction enabled

Currently, I have tried multiple methods, but I still cannot retrieve any messages from the queue. I can confirm that if it's a non-transactional queue, I am indeed able to receive messages. Please assist me with this. Here is the code I wrote:

def send_message(queue_name: str, label: str, message: str):
    queue_info = win32com.client.Dispatch("MSMQ.MSMQQueueInfo")
    queue_info.FormatName = f'direct=tcp:{host_name}\\PRIVATE$\\{queue_name}'
    queue = None
    try:
        queue = queue_info.Open(2, 0)
        msg = win32com.client.Dispatch("MSMQ.MSMQMessage")
        msg.Label = label
        msg.Body = message
        msg.Send(queue)
    except Exception as e:
        print(f'Error! {e}')
    finally:
        queue.Close()

Upvotes: 0

Views: 148

Answers (1)

Rao
Rao

Reputation: 1

import win32com.client
import os
import clr
from System import Array
from System import Byte

clr.AddReference('System.Messaging')
clr.AddReference('System.IO')
from System.Messaging import Message, MessageQueue, 
MessageQueueTransaction, XmlMessageFormatter
from System.IO import StreamReader


inqueue = '.\\PRIVATE$\\inputqueue'
outqueue = '.\\PRIVATE$\\outputqueue'

#This is to write message to MSMQ
msg = 'This is to test sending a message to a queue'
queue = MessageQueue(inqueue)

transaction = MessageQueueTransaction()
transaction.Begin()
queue.Send(msg, transaction)
transaction.Commit()

#This is to read message from MSMQ (without commit it doesn't remove 
message from the queue)
queue2 = MessageQueue(inqueue)
queue2.Formatter = XmlMessageFormatter(list(str()))
message = Message()
transaction2 = MessageQueueTransaction()
transaction2.Begin()
message = queue2.Receive(transaction2)
print("Message type is: ",type(message))
reader = StreamReader(message.BodyStream)
print(reader.ReadToEnd())

transaction2.Commit()  #This line of code removes message after reading it 
if we don't commit then the message will remain in the queue 

queue.Dispose()
queue2.Dispose()

Upvotes: 0

Related Questions