gpt4 book ai didi

python - 如何使用 "pymqi"Python 库在我的队列管理器中配置 CCSID 值?

转载 作者:太空狗 更新时间:2023-10-30 01:04:09 28 4
gpt4 key购买 nike

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

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

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

似乎 MQ 没有正确解码“Ó”字符和“subtipo”字段被保存为“DEMANDA CONTRATACI├ôN”。

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

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

class MQManager:
def __init__(self):
self.queue_manager = config.queue_manager
self.channel = config.channel
self.port = config.port
self.host = config.host
self.conn_info = config.conn_info
self.queue_request_name = config.queue_request_name
self.queue_response_name = config.queue_response_name

cd = pymqi.CD()
cd.ChannelName = self.channel
cd.ConnectionName = self.conn_info
cd.ChannelType = pymqi.CMQC.MQCHT_CLNTCONN
cd.TransportType = pymqi.CMQC.MQXPT_TCP

self.qmgr = pymqi.QueueManager(None)
self.qmgr.connect_with_options(self.queue_manager, opts=pymqi.CMQC.MQCNO_HANDLE_SHARE_NO_BLOCK, cd=cd)

def send_message(self, str_xml_message):
# set message descriptor
request_md = pymqi.MD()
request_md.ReplyToQ = self.queue_response_name
request_md.Format = pymqi.CMQC.MQFMT_STRING

queue_request = pymqi.Queue(self.qmgr, self.queue_request_name)
queue_request.put(str_xml_message.encode("UTF-8"), request_md)
queue_request.close()

# Set up message descriptor for get.
response_md = pymqi.MD()
response_md['CorrelId'] = request_md['MsgId']

gmo = pymqi.GMO()
gmo.Options = pymqi.CMQC.MQGMO_WAIT | pymqi.CMQC.MQGMO_FAIL_IF_QUIESCING
gmo.WaitInterval = 5000 # 5 seconds

queue_response = pymqi.Queue(self.qmgr, self.queue_response_name)
message = queue_response.get_no_rfh2(None, response_md, gmo)
queue_response.close()

return str(message)


def close(self):
self.qmgr.disconnect()

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

谢谢!

最佳答案

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

request_md = pymqi.MD()

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

这可以在 source 中看到:

['CodedCharSetId', CMQC.MQCCSI_Q_MGR, MQLONG_TYPE],

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.


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


您有几个选项可以覆盖它:

  1. 您可以像这样以编程方式覆盖 pymqi MQMD 默认值:

    request_md.CodedCharSetId = 1208
  2. 将环境变量 MQCCSID 设置为您想要的值(在您的例子中为 1208)。这必须在连接到 mq 之前设置。这记录在 IBM MQ v9.0 KC 页面中 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。这记录在 IBM MQ v9.0 KC 页面中 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

关于python - 如何使用 "pymqi"Python 库在我的队列管理器中配置 CCSID 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57857224/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com