Как удалить заголовок RFH2 для клиента JMS

Я использую клиент JMS. Очередь - IBM MQ. Когда я записываю данные в очередь, они добавляются с заголовком RFH. Как я могу снять заголовок RFH. Я не могу использовать IBM MQ apis.

5 ответов

Другой способ - использовать атрибуты URI очереди ( http://www.ibm.com/support/knowledgecenter/api/content/nl/en-us/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q032240_.htm). Атрибут targetClient контролирует, использовать ли RFH или собственный формат.

Queue queue = queueSession.createQueue("queue:///" + queueName + "?targetClient=1");

Начиная с IBM WebSphere MQ v7, рекомендуемый способ сказать реализации Java НЕ генерировать заголовки MQRFH2 - это вызвать MQDestination.setMessageBodyStyle( WMQConstants.WMQ_MESSAGE_BODY_MQ) как TARGCLIENT свойство используется только как запасной вариант, если MessageBodyStyle был явно установлен на UNSPECIFIED,

Используя конфигурацию очереди JNDI, вы можете установить targetClient=MQ, который имеет тот же эффект, что и targetClient=1:

<jmsQueue jndiName="jms/queue/name">
<properties.wmqJms CCSID="819" baseQueueName="MQ.QUEUE.NAME" encoding="273" targetClient="MQ"/>
</jmsQueue>

Вы также можете установить PROPCTL в NONE в самой очереди, и это лишит заголовка, хотя, по моему опыту, лучше сделать это с помощью конфигурации приложения.

В приложении отправителя звоните MQDestination.setTargetClient метод с WMQConstants.WMQ_CLIENT_NONJMS_MQ в качестве параметра. Это обеспечит RFH2 Заголовок не включен в сообщение.

Другое значение, которое можно использовать для метода setTargetClient: MQJMS_CLIENT_JMS_COMPLIANT, Это указывает на то, что RFH2 Формат используется для отправки информации. Приложения, которые используют классы WebSphere MQ для JMS, понимают RFH2 формат. Установить MQJMS_CLIENT_JMS_COMPLIANT константа при обмене информацией с целевыми классами WebSphere MQ для приложения JMS.

Поскольку некоторые читатели, попадающие на эту страницу, МОГУТ фактически использовать IBM API, вот мой код для публикации сообщений для IBM MQ v8 для устаревших клиентов, которые не поддерживают заголовок RFH.

package com.mycompany.mq.client;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Logger;

import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSConsumer;
import javax.jms.JMSContext;
import javax.jms.JMSProducer;
import javax.jms.Queue;
import javax.jms.TextMessage;

import com.ibm.msg.client.jms.JmsConnectionFactory;
import com.ibm.msg.client.jms.JmsFactoryFactory;
import com.ibm.msg.client.wmq.WMQConstants;
import com.ibm.msg.client.wmq.compat.jms.internal.JMSC;


public class FileScanner {

    private static final Logger logger = Logger.getLogger("RJEFileParser");

    public final static char CR  = (char) 0x0D;
    public final static char LF  = (char) 0x0A; 

    public final static String CRLF  = "" + CR + LF;     // "" forces conversion to string

    public static void main(String[] args) throws Exception {

        long m1,m2;

        // Create a connection factory
        JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
        JmsConnectionFactory cf = ff.createConnectionFactory();

        // Set the properties
        String sHost=Config.get("HOST");
        cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, sHost);
        logger.info("WMQ_HOST_NAME:"+sHost);

        String sPort=Config.get("PORT");
        cf.setIntProperty(WMQConstants.WMQ_PORT,  Integer.parseInt(sPort));
        logger.info("WMQ_PORT:"+sPort);

        String sChannel=Config.get("CHANNEL");
        cf.setStringProperty(WMQConstants.WMQ_CHANNEL,  sChannel);
        logger.info("WMQ_CHANNEL:"+sChannel);

        cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
        String sQmgr=Config.get("QMGR");
        cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, sQmgr);
        logger.info("WMQ_QUEUE_MANAGER:"+sQmgr);

        String sAppName=Config.get("APPLICATION_NAME");
        cf.setStringProperty(WMQConstants.WMQ_APPLICATIONNAME, sAppName);
        logger.info("WMQ_APPLICATIONNAME:"+sAppName);


        boolean bAuth = Boolean.parseBoolean(Config.get("AUTH")); // true
        boolean bMqcsp = Boolean.parseBoolean(Config.get("USER_AUTHENTICATION_MQCSP")); // false
        String sAppUser = null, sAppPass = null;

        logger.info("Auth:"+bAuth);
        if (bAuth) {
            cf.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, bMqcsp);
            logger.info("USER_AUTHENTICATION_MQCSP:"+bMqcsp);

            if (!bMqcsp) {
                sAppUser=Config.get("APP_USER");
                cf.setStringProperty(WMQConstants.USERID, sAppUser);
                logger.info("APP_USER:"+sAppUser);

                sAppPass=Config.get("APP_PASSWORD");
                cf.setStringProperty(WMQConstants.PASSWORD, sAppPass);
                logger.info("APP_PASSWORD:"+sAppPass);
            }
        }

        // Create JMS objects

        try {
            Connection con;
            logger.info("Creating connection... context: \n"+ cf.toString());
            if (bAuth && !bMqcsp) {
                con = cf.createConnection(sAppUser, sAppPass);
            }
            else {
                con = cf.createConnection();
            }
            con.close(); // connection was created for testing credentials and troubleshooting purposes

            JMSContext context = cf.createContext();


            //Set up the message
            String text = "here goes your payload text" ;
            logger.info("Text:"+text);

            TextMessage message = context.createTextMessage(text);
            // message.setIntProperty(WMQConstants.JMS_IBM_CHARACTER_SET , 437);
            // message.setIntProperty(WMQConstants.JMS_IBM_ENCODING , 546);
            message.setBooleanProperty(WMQConstants.WMQ_PERSISTENCE, Boolean.FALSE);
            JMSProducer producer = context.createProducer();

            // create Queue object
            com.ibm.mq.jms.MQQueue q1 = new com.ibm.mq.jms.MQQueue();
            q1.setBaseQueueManagerName("MYQUEUEMANAGERNAME");
            q1.setBaseQueueName("MYINPUTQUEUENAME");
            q1.setPersistence(DeliveryMode.NON_PERSISTENT);
            q1.setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ); // Avoids RFH header!

            // publish the message to queue
            producer.send(q1, message);
            logger.info("JMS message:\n" + message);


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Спасибо за ваши ответы. Ответы от Ставр00 и Шаши были правильными. Хотя я исправил это с помощью адаптера ресурсов wmq. В конфигурации для адаптера ресурса я использовал

<config-property name="targetClient">MQ</config-property>

Это эквивалентно установке WMQConstants.WMQ_CLIENT_NONJMS_MQ в очередь.

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