如何使用“ pymqi” Python库在队列管理器中配置CCSID值?

Dan*_*ara 5 python ibm-mq

我当前正在开发一个需要连接MQ队列的应用程序,以使该队列将消息信息保存在另一个服务中。完成后,该服务通过MQ队列返回结果消息,并将其返回给我。

我正在发送包含类似于以下内容的XML消息的字符串消息:

<?xml version="1.0" encoding="UTF-8"?>
<peticionDemanda>
<subtipo>DEMANDA CONTRATACIÓN</subtipo>
</peticionDemanda>
Run Code Online (Sandbox Code Playgroud)

看来MQ不能正确解码“Ó”字符,并且“ subtipo”字段被保存为“ DEMANDA CONTRATACI?N”。

我将消息编码为“ UTF-8”,并被告知用于发送消息的CCSID是850而不是1208(属于UTF-8的CCSID)。

要运行MQ管理器,我在“客户端模式”中使用“ pymqi” Python库。这是我用来将消息发送到队列并获得响应的MQManager类:

<?xml version="1.0" encoding="UTF-8"?>
<peticionDemanda>
<subtipo>DEMANDA CONTRATACIÓN</subtipo>
</peticionDemanda>
Run Code Online (Sandbox Code Playgroud)

我想知道如何定义MQ Manager的CCSID值并希望解决代码页不匹配的问题。

谢谢!

Jos*_*hMc 3

在您的代码中,您为在这行代码中发送的消息创建默认消息描述符:

request_md = pymqi.MD()
Run Code Online (Sandbox Code Playgroud)

默认情况下,pymqi(如底层 IBM MQ C 库)会将消息描述符设置CodedCharSetId为值CMQC.MQCCSI_Q_MGR

这可以在源码中看到:

['CodedCharSetId', CMQC.MQCCSI_Q_MGR, MQLONG_TYPE],
Run Code Online (Sandbox Code Playgroud)

IBM MQ v9.0 KC 页面参考 > 开发应用程序参考 > MQI 应用程序参考 > MQI 中使用的数据类型 > MQMD - 消息描述符 > MQMD 字段 > CodedCharSetId (MQLONG)描述了客户端如何处理此问题:

对于客户端应用程序,MQCCSI_Q_MGR 是根据客户端的区域设置(而不是队列管理器上的区域设置)填充的。


IBM MQ 故障排除文档What CCSID is default for WebSphere MQ client messages以稍微不同的方式解释了这一点:

MQ 客户端根据客户端应用程序运行的环境设置 MQCCSI_Q_MGR 值。


根据850 CCSID,我猜测您运行的 Windows 操作系统不在美国(通常使用 CCSID 437)。


您有几个选项可以覆盖此设置:

  1. 您可以通过编程方式覆盖 pymqi MQMD 默认值,如下所示:

    request_md.CodedCharSetId = 1208
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将 env 变量设置MQCCSID为您想要的值(在您的例子中为 1208)。这必须在连接到 mq 之前设置。这记录在 IBM MQ v9.0 KC 页面开发应用程序 > 使用 IBM MQ 开发 MQI 应用程序 > 编写客户端过程应用程序 > 在客户端应用程序中使用 MQI > 选择客户端或服务器 CCSID

    以下示例适用于 Windows:

    SET MQCCSID=1208
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您可以在节下mqclient.ini设置。这记录在 IBM MQ v9.0 KC 页面配置 > 配置服务器和客户端之间的连接 > 使用配置文件配置客户端 > 客户端配置文件的 CHANNELS 节中。例如:CCSID=numberCHANNELS

    CHANNELS:
       CCSID=1208
    
    Run Code Online (Sandbox Code Playgroud)