EBCDIC中的大型机MQ到独立JMS

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

在Java应用程序中,我试图浏览来自大型机IBM MQ队列(EBCDIC消息)的消息。我需要浏览邮件,而不是使用它们。代码如下:

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())我用这个解决方案编辑了原始帖子。