Spring Boot 使用JMS发送和接收SWIFT报文

zfycwa2u  于 2022-12-12  发布在  Spring
关注(0)|答案(2)|浏览(244)

我目前正在尝试在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);
jmo0nnb3

jmo0nnb31#

我认为有人给了你一些关于MQRFH2消息的错误信息。
如果您的应用程序是JMS应用程序,那么您就完全走错了路。
IBM MQ将JMS消息视为MQRFH2消息。因此,当您发送JMS应用程序时,您不需要创建MQRFH2消息。IBM MQ会自动为您创建MQRFH2消息。
第二,您谈到了XML消息,但在代码中没有看到任何有关XML或CDATA的内容。如果您希望将二进制数据作为XML消息的一部分发送,则必须使用CDATA。
如果你想要消息的属性,那么你需要把它们放在JMS应用程序的“usr”文件夹中。如果你想使用不同的文件夹,那么你需要使用一个常规的Java应用程序(非JMS),当然,然后构建一个MQRFH2头。

4urapxun

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文件夹中,对吗?

相关问题