Как удалить заголовок 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 в очередь.