EBCDIC中的大型机MQ到独立JMS
在Java应用程序中,我试图浏览来自大型机IBM MQ队列(EBCDIC消息)的消息。我需要浏览邮件,而不是使用它们。代码如下:EBCDIC中的大型机MQ到独立JMS,jms,ibm-mq,ebcdic,Jms,Ibm Mq,Ebcdic,在Java应用程序中,我试图浏览来自大型机IBM MQ队列(EBCDIC消息)的消息。我需要浏览邮件,而不是使用它们。代码如下: JmsFactoryFactory ff=JmsFactoryFactory.getInstance(WMQConstants.WMQ_提供程序); JmsConnectionFactory cf=ff.createConnectionFactory(); //设置属性 cf.setStringProperty(WMQConstants.WMQ_主机名,主机); cf
JmsFactoryFactory ff=JmsFactoryFactory.getInstance(WMQConstants.WMQ_提供程序);
JmsConnectionFactory cf=ff.createConnectionFactory();
//设置属性
cf.setStringProperty(WMQConstants.WMQ_主机名,主机);
cf.setIntProperty(WMQConstants.WMQ_端口,端口);
cf.setStringProperty(WMQConstants.WMQ_通道,通道);
cf.setIntProperty(WMQConstants.WMQ_连接模式,WMQConstants.WMQ_CM_客户端);
cf.setStringProperty(WMQConstants.WMQ_队列管理器,qmgr);
cf.setIntProperty(WMQConstants.WMQ_RECEIVE_CONVERSION,WMQConstants.WMQ_RECEIVE_CONVERSION_QMGR);
QueueBrowser browser=context.createBrowser(context.createQueue(“队列://“+queueName+”?targetClient=1”);
枚举=browser.getEnumeration();
while(枚举.hasMoreElements()){
textMessageInTheQueue=(TextMessage)枚举.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());
这里有一些示例:您是否尝试过不使用cf.setIntProperty(WMQConstants.WMQ\u RECEIVE\u CONVERSION,WMQConstants.WMQ\u RECEIVE\u CONVERSION\u QMGR)代码>?请注意,targetClient
与生产者相关,而不是与接收者相关,它在您设置的上下文中可能没有影响。您是否直接连接到大型机?我相信,如果不设置CCSID,CCSID将默认为队列管理器的CCSID,用于WMQ\u RECEIVE\u CONVERSION\u QMGR
。如果未设置WMQ\u RECEIVE\u转换
,则默认情况下应为IBM MQ classes for JMS进行转换,此转换的CCSID目标通常为1208
,即UTF-8
。我认为如果您不设置WMQ\u RECEIVE\u CONVERSION
,您应该获得可以阅读的文本,或者将您的CCSID设置为1208
,看看队列管理器是否可以转换它。我尝试了设置WMQ\u RECEIVE\u CONVERSION
,但结果相同,仍然没有可读的“UTF-8”。我认为枚举.nextElement()代码>仅返回文本JMSTextMessage
。根据:我需要一个jmsbytes消息
,这样我就可以执行转换。如果您使用的是IBM MQ jar文件,那么是什么版本?我最终切换到com.IBM.MQ
Jars,而不是com.IBM.msg.client.jms
和com.IBM.jms
。在这种情况下,没有更多的JMS层。下面是我使用的代码:基本上,通过这个解决方案,我能够得到一个字节数组并转换成字符串:byte[]strData=newbyte[theMessage.getMessageLength()];theMessage.readFully(strData,0,theMessage.getMessageLength())代码>我用这个解决方案编辑了原始帖子。