You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python向启用事务的MSMQ发送消息?发送后无法接收求助

MSMQ事务性队列无法接收消息问题排查

我尝试了多种方法,仍无法从事务性队列中获取任何消息,但确认使用非事务性队列时可以正常接收消息,需要协助解决。以下是我编写的发送消息代码:

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()

问题原因与解决方法

核心问题

事务性队列的消息发送必须在事务上下文中完成,原代码缺少事务处理逻辑,导致消息无法被正确提交到事务性队列中。

具体修复点

  • 添加MSMQ事务对象:创建MSMQ.MSMQTransaction对象管理事务生命周期
  • 调整队列打开模式:发送事务性消息需使用MQ_SEND_ACCESS(参数值1)打开队列
  • 关联事务发送:调用msg.Send()时传入事务对象,完成后提交事务;异常时回滚事务

修改后的代码

import win32com.client

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
    tx = None
    try:
        # 初始化事务对象
        tx = win32com.client.Dispatch("MSMQ.MSMQTransaction")
        # 以发送权限打开队列
        queue = queue_info.Open(1, 0)
        msg = win32com.client.Dispatch("MSMQ.MSMQMessage")
        msg.Label = label
        msg.Body = message
        # 关联事务发送消息
        msg.Send(queue, tx)
        # 提交事务,确认消息写入队列
        tx.Commit()
    except Exception as e:
        print(f'Error! {e}')
        # 发生异常时回滚事务,丢弃消息
        if tx:
            tx.Abort()
    finally:
        if queue:
            queue.Close()

额外注意事项

  • 接收端同样需要使用事务模式打开队列,调用带事务参数的接收方法,才能读取事务性队列中的消息
  • 确认目标队列确实是事务性队列:创建队列时需勾选“事务性”选项,或通过代码设置queue_info.Transactional = True
  • 检查MSMQ服务状态、队列权限(发送/接收账户需有对应权限),远程队列需确保TCP 1801端口开放

内容的提问来源于stack exchange,提问作者倪港钧

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:57:07