如何使用Python在启用事务的情况下向MSMQ发送消息

问题描述 投票:0回答:1

目前,我已经尝试了多种方法,但仍然无法从队列中检索到任何消息。我可以确认,如果它是非事务性队列,我确实能够接收消息。请协助我。 这是我写的代码:

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()
python transactions msmq
1个回答
0
投票
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()
© www.soinside.com 2019 - 2024. All rights reserved.