我目前正在尝试在SWIFT FileAct上发送和接收报文。当前的实现基于JMS。要求是,我需要发送一个xml报文作为有效载荷,一个XML报头(根据我得到的信息,该报头应该是RFH 2报头)和可能的附件文件(因此是FileAct)。
我有一个与队列管理器的工作连接,能够发送和读取一般的文本或字节消息。问题是,格式似乎不正确,就RFH 2报头和有效载荷而言(以及以后可能的附件)。所以当我阅读邮件时(我可以发送给我自己)我只是在处理一个字节流。问题是,怎么说,当消息的什么部分是什么(头部/有效载荷/附件),因为它只是一个字节流。
我可以添加一些代码块。和两个屏幕截图从控制台时,操作完成。也许你可以看到一些东西,我错过了?
public void sendAByteMessage(JmsConnectionFactory connectionFactory, Destination destination) {
String ifCobaString = "IF_COBA";
String filename;
FileInputStream inStream;
BytesMessage bytesMessage;
int bytesRead;
int bytesTotalSize = 0;
byte[] buf1 = new byte[64];
// write RFH2-Header
MQRFH2 mqrfh2 = new MQRFH2();
ByteArrayOutputStream out = new ByteArrayOutputStream();
mqrfh2.setEncoding(CMQC.MQENC_NATIVE);
mqrfh2.setCodedCharSetId(CMQC.MQCCSI_INHERIT);
mqrfh2.setFormat(CMQC.MQFMT_NONE);
mqrfh2.setFlags(0);
mqrfh2.setNameValueCCSID(1208);
mqrfh2.setFieldValue(ifCobaString, "OriginatorApplication", "data");
mqrfh2.setFieldValue(ifCobaString, "Requestor", "ou=data,o=data,o=swift");
mqrfh2.setFieldValue(ifCobaString, "Responder", "ou=data,o=data,o=swift");
mqrfh2.setFieldValue(ifCobaString, "Service", "swift.data");
mqrfh2.setFieldValue(ifCobaString, "RequestType", "data");
mqrfh2.setFieldValue(ifCobaString, "Compression", "Zip");
mqrfh2.setFieldValue(ifCobaString, "FileName", "data.zip");
mqrfh2.setFieldValue(ifCobaString, "FileReference", "data.zip");
mqrfh2.write(new DataOutputStream(out), CMQC.MQENC_NATIVE, 819);
byte[] bytesHeader = out.toByteArray();
// set the input file to be send
filename = "/opt/mq/TC.SB13.0015484631.zip"; // just a random file that I am trying to send over the message
inStream = new FileInputStream(filename);
JMSContext producerContext = connectionFactory.createContext();
JMSProducer producer = producerContext.createProducer();
bytesMessage = producerContext.createBytesMessage();
// add RHF2-header to the message
bytesMessage.writeBytes(bytesHeader);
// add payload to the message
while ((bytesRead = inStream.read(buf1)) != -1) {
bytesMessage.writeBytes(buf1, 0, bytesRead);
bytesTotalSize += bytesRead;
System.out.println("Writing " + bytesRead + " bytes into message..");
}
System.out.println("Finished writing " + bytesTotalSize + " bytes into message!");
producer.send(destination, bytesMessage);
producerContext.close();
inStream.close();
}
这是阅读它的代码。FileOutputStream也成功地创建了WRITE. zip文件,但是我们没有任何关于头文件的信息。这有点翻译丢失。
我不确定我们是否需要先读取文件头的x个字节,然后读取文件的其余部分。但是我很困惑,因为这里我们使用了文件的整个消息长度,因为文件头没有任何额外的内容。这有点令人困惑。
// The message is sent as a Message object, so we must determine its type
if (message instanceof TextMessage) {
System.out.println("-- reading TEXT-message..");
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("-- MyMessageListener received message with payload: " + textMessage.getText());
} catch (JMSException jmse) {
System.out.println("JMS Exception in MyMessageListener class (TextMessage)!");
System.out.println(jmse.getLinkedException());
}
} else if (message instanceof BytesMessage) {
System.out.println("-- reading BYTE-message..");
BytesMessage bytesMessage = (BytesMessage) message;
try {
int textLength = (int) bytesMessage.getBodyLength();
byte[] textBytes = new byte[textLength];
bytesMessage.readBytes(textBytes, textLength);
// Save file
FileOutputStream fos = new FileOutputStream("/opt/mq/WRITE.zip");
fos.write(textBytes);
fos.close();
// Show content of file
String content = new String(textBytes);
System.out.println(content);
2条答案
按热度按时间jmo0nnb31#
我认为有人给了你一些关于MQRFH2消息的错误信息。
如果您的应用程序是JMS应用程序,那么您就完全走错了路。
IBM MQ将JMS消息视为MQRFH2消息。因此,当您发送JMS应用程序时,您不需要创建MQRFH2消息。IBM MQ会自动为您创建MQRFH2消息。
第二,您谈到了XML消息,但在代码中没有看到任何有关XML或CDATA的内容。如果您希望将二进制数据作为XML消息的一部分发送,则必须使用CDATA。
如果你想要消息的属性,那么你需要把它们放在JMS应用程序的“usr”文件夹中。如果你想使用不同的文件夹,那么你需要使用一个常规的Java应用程序(非JMS),当然,然后构建一个MQRFH2头。
4urapxun2#
关于XML部分,我这里有一张我收到的图片。第二行显示了XML格式的头,我们应该把它放到RFH 2头中(至少企业是这么说的,但他们对实现本身一无所知)。所以你可能是对的,他们谈论RFH 2-header是因为他们用某种 Package 器软件做的事情。如果我使用JMS,我可能不直接需要它,正如你所说:
table
有效负载应该是一个. zip存档,其中包含acmt消息(https://www.iso20022.org/iso-20022-message-definitions),这些消息基本上是具有专用格式的XML消息。
因此,基本上我必须将RFH 2头中需要的数据添加到消息的usr文件夹中,对吗?