gpt4 book ai didi

jms - 大型机 MQ 到 EBCDIC 中的独立 JMS

转载 作者:行者123 更新时间:2023-12-04 17:31:02 39 4
gpt4 key购买 nike

我正在尝试从 Java 应用程序浏览来自大型机 IBM MQ 队列的消息(EBCDIC 消息)。我需要浏览消息,而不是消费它们。这是代码:

JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactory cf = ff.createConnectionFactory();

// Set properties
cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, host);
cf.setIntProperty(WMQConstants.WMQ_PORT, port);
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, channel);
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, qmgr);
cf.setIntProperty(WMQConstants.WMQ_RECEIVE_CONVERSION, WMQConstants.WMQ_RECEIVE_CONVERSION_QMGR);

QueueBrowser browser = context.createBrowser(context.createQueue("queue:///" + queueName + "?targetClient=1"));
Enumeration enumeration = browser.getEnumeration();

while (enumeration.hasMoreElements()) {
TextMessage messageInTheQueue = (TextMessage) enumeration.nextElement();
System.out.println(messageInTheQueue);
nbRecords++;
}

System.out.println() 的结果如下:

  JMSMessage class: jms_text
JMSType: null
JMSDeliveryMode: 2
JMSMessageID: ID:c1d4d840d4d8e3c1e2f24040404040405e2432bd21aa1b02
JMSTimestamp: 1579537307450
JMSRedelivered: false
JMSXAppID:
JMSXDeliveryCount: 1
JMSXUserID:
JMS_IBM_Character_Set: IBM037
JMS_IBM_Encoding: 273
JMS_IBM_Format: MQSTR
JMS_IBM_MsgType: 8
JMS_IBM_PutApplType: 8
JMS_IBM_PutDate: 20200120
JMS_IBM_PutTime: 16214745
ÍÍÑÀ ...

我想将此 EBCDIC 消息 ÍÍÑÀ ... 转换为可读的内容 (ASCII)。

我尝试将 enumeration.nextElement() 转换为 JMSByteMessage 但出现此异常:

class com.ibm.msg.client.jms.internal.JmsTextMessageImpl cannot be cast to class com.ibm.jms.JMSBytesMessage

我该怎么做?

解决方法:使用适用于 Java 的 MQ 类 而不是适用于 Java 的 MQ JMS 类:

byte[] strData = new byte[theMessage.getMessageLength()];
theMessage.readFully(strData, 0, theMessage.getMessageLength());

这里有一些例子:https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q030840_.htm

最佳答案

关于 OP 的原始代码,以下文档指出接收转换和 CCSID 仅对 MQDestination 类有效:https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-properties-mq-classes-jms-objects

因此,这可以通过用于 JMS 的 IBM MQ 类来完成。你只需要以一种更迂回的方式来做。

为了使 QueueBrowser 读取 EBCDIC 格式的消息,您需要将 JMS 队列转换为 MQDestination,然后设置 receiveConversion 和 receiveCCSID,然后在创建浏览器时,将 MQDestination 转换回常规 JMS 队列。像这样:

JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactory cf = ff.createConnectionFactory();

// Set properties
cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, host);
cf.setIntProperty(WMQConstants.WMQ_PORT, port);
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, channel);
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, qmgr);

JMSContext context = cf.createContext();
MQDestination targetQueue = (MQDestination) context.createQueue("queue:///" + queueName)
targetQueue.setReceiveCCSID(WMQConstants.CCSID_UTF8);
targetQueue.setReceiveConversion(WMQConstants.WMQ_RECEIVE_CONVERSION_QMGR);
targetQueue.setMessageBodyStyle(WMQConstants.WMQ_MESSAGE_BODY_MQ);
QueueBrowser browser = context.createBrowser((Queue) targetQueue);
Enumeration enumeration = browser.getEnumeration();

while (enumeration.hasMoreElements()) {
TextMessage messageInTheQueue = (TextMessage) enumeration.nextElement();
System.out.println(messageInTheQueue);
nbRecords++;
}

以这种方式执行时,您也不需要使用 JMS URI 属性来设置目标客户端,因为 MQDestination 具有所有必要的 getter/setter 来修改属性负载,否则这些属性将使用 URI 完成。

有关 MQDestination 的更多信息,请参阅以下文档:https://www.ibm.com/docs/en/ibm-mq/9.2?topic=jms-mqdestination

关于jms - 大型机 MQ 到 EBCDIC 中的独立 JMS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59829168/

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