Отправить сообщение JMS в IBM-MQ с заголовком MQIIH

Может ли кто-нибудь помочь мне отправить сообщение JMS в IBM-MQ с заголовками IIH (MQIIH)?

Я использую приложение Spring Boot с mq-jms-spring-boot-starter версии 2.4.5.

Когда я отправляю сообщение, оно всегда идет с заголовком RFH2, хотя оно устанавливает StrucId как IIH в заголовке сообщения.

public void send(Request mqRequest) throws JMSException {
    log.info("sending with message [{}] to queue [{}].", mqRequest.getMessage(), QUEUE_NAME);
    MQQueue destinationQueue = new MQQueue(QUEUE_NAME);
    jmsTemplate.convertAndSend(destinationQueue, mqRequest.getMessage(), message -> {
        log.info("setting standard JMS headers before sending");
       message.setJMSCorrelationID(UUID.randomUUID().toString());
        message.setJMSDestination(new MQQueue(QUEUE_NAME));
        message.setJMSTimestamp(System.nanoTime());
        message.setJMSType("MQIIH");
        message.setStringProperty("Authenticator", "********");
        message.setStringProperty("Format", "********");
        message.setStringProperty("ReplyToFormat", "********");
        message.setIntProperty("CommitMode", '0');
        message.setStringProperty("LTermOverride", "********");
        message.setStringProperty("MFSMapName", "********");
        message.setIntProperty("SecurityScope", 'C');
        message.setStringProperty("StrucId", "IIH ");
        message.setIntProperty("StrucLength", 84);
        message.setIntProperty("Version", 1);
        return message;
    });
}

Я не думаю, что вы можете сделать это в JMS, вы должны использовать классы Java API MQIIH, MQHeaderList, MQMessage, MQQueue и MQQueueManager, чтобы создать и отправить такое сообщение.

Daniel Steinmann 10.01.2023 23:50

Спасибо, @DanielSteinmann, у вас есть пример кода, на который я могу сослаться?

Javanectar 11.01.2023 09:15

Я добавил ответ, который использует только MQIIH класс Java MQ, но все остальное остается в JMS API. Это работает вчетвером?

Daniel Steinmann 12.01.2023 11:04

Да, @DanielSteinmann работает отлично, теперь у меня есть еще один вопрос. Как мы можем передать транкод в сообщениях IMS?

Javanectar 12.01.2023 15:58

Я ответил на ваш дополнительный вопрос о trancode как комментарий в своем ответе. Если мой ответ решил ваш первоначальный вопрос, вы также можете принять этот ответ, см. Что мне делать, когда кто-то отвечает на мой вопрос?

Daniel Steinmann 12.01.2023 21:34
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
Лучшая компания по разработке спортивных приложений
Лучшая компания по разработке спортивных приложений
Ищете лучшую компанию по разработке спортивных приложений? Этот список, несомненно, облегчит вашу работу!
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
Деревья поиска (Алгоритм4 Заметки к учебнику)
Деревья поиска (Алгоритм4 Заметки к учебнику)
(1) Двоичные деревья поиска: среднее lgN, наихудшее N для вставки и поиска.
2
5
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На чистом JMS этого сделать нельзя, приходится использовать вспомогательный класс MQIIH:

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import javax.jms.BytesMessage;
import com.ibm.mq.headers.MQIIH;
import com.ibm.msg.client.jms.JmsConstants;
...

public void send(Request mqRequest) throws JMSException {
    log.info("sending with message [{}] to queue [{}].", mqRequest.getMessage(), QUEUE_NAME);
    MQIIH mqiih = new MQIIH();
    mqiih.setAuthenticator("***");
    // set other MQIIH header values
    ByteArrayOutputStream mqiihBytes = new ByteArrayOutputStream();
    mqiih.write(new DataOutputStream(mqiihBytes));
    String destinationQueue = "queue:///" + QUEUE_NAME + "?targetClient=1";
    jmsTemplate.send(destinationQueue, (MessageCreator) session -> {
        BytesMessage message = session.createBytesMessage();
        message.setStringProperty(JmsConstants.JMS_IBM_FORMAT, "MQIMS");
        message.writeBytes(mqiihBytes.toByteArray());
        message.writeBytes("This Is The Body".getBytes());
        return message;

    });
}

С опцией очереди targetClient=1 обычный заголовок RFH2 с метаинформацией JMS удаляется. Сообщение будет выглядеть так:

5724-H72 (C) Copyright IBM Corp. 1994, 2022.
IBM MQ Queue Load/Unload Utility
* DMPMQMSG Version:9.3.1.0 Created:Wed Jan 11 08:41:37 2023
* Qmgr  = QM1
* Queue = Q1

A VER 2
A RPT 0
A MST 8
A EXP -1
A FDB 0
A ENC 273
A CCS 819
A FMT MQIMS   
A PRI 4
A PER 1
A MSI 414D5120514D312020202020202020204337BB6301ED0140
A COI 000000000000000000000000000000000000000000000000
A BOC 0
A RTQ                                                 
A RTM QM1                                             
A USR mqm         
A ACC 0000000000000000000000000000000000000000000000000000000000000000
A AIX 2020202020202020202020202020202020202020202020202020202020202020
A PAT 28
A PAN runner.RemoteTestRunner     
A PTD 20230111
A PTT 08413426
A AOX 20202020
A GRP 000000000000000000000000000000000000000000000000
A MSQ 1
A OFF 0
A MSF 0
A ORL -1
T IIH 
X 00000001000000
T T
X 0000011100000000
T         
X 00000000
T                         ***     
X 00000000000000000000000000000000
T     This Is The Body

Read    - Files:   0  Messages:1  Bytes:100
Written - Files:   0  Messages:1  Bytes:100

Спасибо, @Daniel за вашу помощь, это очень помогает мне подключиться к MQ с заголовком IIH. Знаете ли вы, как мы можем передать транскод (код транзакции, определяющий режим транзакции) в сообщении IMS?

Javanectar 12.01.2023 15:40

Добавление trancode на самом деле является еще одним вопросом, поэтому было бы лучше, если бы вы задали другой вопрос. В любом случае: вы смотрели Как мост IMS обрабатывает сообщения и MQFMT_IMS_VAR_STRING в главе Формат MQMD?

Daniel Steinmann 12.01.2023 21:27

Похоже, вам просто нужно добавить LLZZ<trancode><data> (LL: 2-байтовое поле длины, указывающее общую длину строки переменной IMS, ZZ: 2-байтовое поле, содержащее флаги, значимые для IMS).

Daniel Steinmann 12.01.2023 21:28

Другие вопросы по теме