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

2024-09-28 01:24:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我发送的是一个字符串消息,其中包含一个类似于以下消息的XML消息:

<?xml version="1.0" encoding="UTF-8"?>
<peticionDemanda>
<subtipo>DEMANDA CONTRATACIÓN</subtipo>
</peticionDemanda>

MQ似乎没有正确解码“Ó”字符,“subtop”字段被保存为“DEMANDA contraci├N”。在

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

为了运行MQ管理器,我在客户机模式下使用“pymqi”Python库。这是用于向队列发送消息并获取响应的MQManager类:

^{pr2}$

我想知道如何定义MQ管理器的CCSID值,希望能够解决代码页不匹配的问题。在

谢谢你!在


Tags: 字符串信息应用程序消息管理器队列versionxml
2条回答

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

request_md = pymqi.MD()

默认情况下,pymqi(与底层ibmqc库类似)将消息描述符CodedCharSetId设置为值CMQC.MQCCSI_Q_MGR。在

这可以在source中看到:

^{pr2}$

IBM MQ v9.0 KC页面Reference > Developing applications reference > MQI applications reference > Data types used in the MQI > MQMD - Message descriptor > Fields for MQMD > CodedCharSetId (MQLONG)描述了客户机如何处理此问题:

For client applications, MQCCSI_Q_MGR is filled in, based on the locale of the client rather than the one on the queue manager.


IBM MQ疑难解答文档What CCSID is used by default for WebSphere MQ client messages以稍微不同的方式解释了这一点:

A MQ client sets the MQCCSI_Q_MGR value based on the environment in which the client application is running.


基于850CCSID,我猜您运行的是一个不在美国的Windows操作系统(通常使用ccsid437)。在


有几个选项可以覆盖此选项:

  1. 您可以按如下方式以编程方式重写pymqi MQMD默认值:

    request_md.CodedCharSetId = 1208
    
  2. 将env变量MQCCSID设置为所需的值(在本例中为1208)。必须在连接到mq之前设置此选项。这在IBMMQV9.0KC页面Developing applications > Developing MQI applications with IBM MQ > Writing client procedural applications > Using the MQI in a client application > Choosing client or server CCSID中有记录。在

    以下示例适用于Windows:

    SET MQCCSID=1208
    
  3. mqclient.ini中,可以在CHANNELS节下设置CCSID=number。这在IBMMQV9.0KC页面Configuring > Configuring connections between the server and client > Configuring a client using a configuration file > CHANNELS stanza of the client configuration file中有记录。例如:

    CHANNELS:
       CCSID=1208
    

您不需要更改队列管理器的CCSID。您的问题是,您的邮件包含UTF-8字符,但您是在信封中发送的,该信封将其描述为包含CCSID 850个字符。您只需更新发送邮件的信封,就可以正确地描述您的内容。在

我是ibmq专家和C程序员,但不是pymqi程序员,但是,看一下pymqi帮助和您的示例,我希望这些是您的代码所需的附加内容。在

# set message descriptor
request_md = pymqi.MD()
request_md.ReplyToQ = self.queue_response_name
request_md.Format = pymqi.CMQC.MQFMT_STRING
request_md.CodedCharSetId = 1208

pymqi帮助没有包含任何使用CodedCharSetId的示例,但是看起来MQMD中的所有pymqi字段的拼写和大小写与“C”API头文件cmqc.h中的字段完全相同。在

请试试这个,看看能不能解决你的问题。在

相关问题 更多 >

    热门问题