如何删除JMS客户端的RFH2头
我正在使用JMS客户机。队列是一个IBM MQ。当我在队列上写入数据时,它将与RFH头一起添加。如何剥离RFH标头。我无法使用IBM MQ API。在发送方应用程序调用如何删除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格式
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)
asTARGCLIENT
属性仅在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”))。