如何删除JMS客户端的RFH2头

如何删除JMS客户端的RFH2头,jms,ibm-mq,rfh2,Jms,Ibm Mq,Rfh2,我正在使用JMS客户机。队列是一个IBM MQ。当我在队列上写入数据时,它将与RFH头一起添加。如何剥离RFH标头。我无法使用IBM MQ API。在发送方应用程序调用MQDestination.setTargetClient方法中,使用WMQConstants.WMQ\u CLIENT\u NONJMS\u MQ作为参数。这将确保消息中不包含RFH2标题 可用于setTargetClient方法的另一个值是MQJMS\u CLIENT\u JMS\u COMPLIANT。这表示使用RFH2格式

我正在使用JMS客户机。队列是一个IBM MQ。当我在队列上写入数据时,它将与RFH头一起添加。如何剥离RFH标头。我无法使用IBM MQ API。

在发送方应用程序调用
MQDestination.setTargetClient
方法中,使用
WMQConstants.WMQ\u CLIENT\u NONJMS\u MQ
作为参数。这将确保消息中不包含
RFH2
标题


可用于setTargetClient方法的另一个值是
MQJMS\u CLIENT\u JMS\u COMPLIANT
。这表示使用
RFH2
格式发送信息。使用WebSphere MQ类进行JMS的应用程序理解
RFH2
格式。当您与目标WebSphere MQ classes for JMS应用程序交换信息时,设置
MQJMS\u CLIENT\u JMS\u COMPLIANT
常量。

另一种方法是使用队列URI属性()。 属性
targetClient
控制是使用RFH格式还是本机格式

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

谢谢你的回复。Stavr00和Shashi的回答是正确的。 虽然我通过使用wmq资源适配器修复了它。在资源适配器的配置中,我使用

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

这相当于将WMQConstants.WMQ_CLIENT_NONJMS_MQ设置为队列。

使用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
,这将剥离头部,但根据我的经验,最好是通过应用程序配置来完成。

从IBM WebSphere MQ v7开始,建议告诉Java实现不要生成MQRFH2头的方法是调用
MQDestination.setMessageBodyStyle(WMQConstants.WMQ_MESSAGE_BODY_MQ)
as
TARGCLIENT
属性仅在
MessageBodyStyle
被显式设置为
UNSPECIFIED

时用作回退选项,因为一些登录到此页面的读卡器实际上可以使用IBM API,以下是我为不支持RFH头的旧客户端发布IBM MQ v8消息的代码

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();
        }
    }

}

我试图设置如下所示,但即使头没有反映在IBMMQ侦听器端,我还是使用SpringBootFrom(“direct:request”)进行了设置。setProperty(“TARGCLIENT”,常量(“1”))。setHeader(“JMS\u IBM\u字符集”,常量(“UTF-8”))。