java - 如何通过带有 RFH 的 IBM MQ 远程队列发送消息头属性?
问题描述
我需要将消息推送到发送一些标头属性的远程队列中。在我这边,我使用的是 IBM MQ v9,我不能使用 MQRFH2,只能使用“本机”MQ 标头(我不确定是否可能)。但是当我拉出消息时,我看不到任何属性。
import javax.jms.Destination;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.JMSProducer;
import com.ibm.mq.jms.MQDestination;
import com.ibm.msg.client.jms.JmsConnectionFactory;
import com.ibm.msg.client.jms.JmsFactoryFactory;
import com.ibm.msg.client.wmq.WMQConstants;
public class MessageSender {
public void sendMessage() throws JMSException {
JMSContext context = createJMSContext();
JMSProducer producer = context.createProducer();
Destination destination = context.createQueue("queue:///" + queueName);
System.out.println("destination: " + destination);
MQDestination mqDestination = (MQDestination) destination;
// the header properties to be added
mqDestination.setStringProperty("KEY1", "VALUE1");
mqDestination.setStringProperty("KEY2", "VALUE2");
mqDestination.setStringProperty("KEY3", "VALUE3");
// WMQ_CLIENT_NONJMS_MQ - static final int WMQ_CLIENT_NONJMS_MQ
// WMQ_TARGET_CLIENT property value. Target is an MQ application (RFH2 will be excluded).
mqDestination.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
System.out.println("mqDestination: " + mqDestination);
String message = "mymessage";
producer.send(mqDestination, message);
}
private JMSContext createJMSContext() {
JMSContext context = null;
try {
JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactory cf = ff.createConnectionFactory();
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, false);
cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, "hostname");
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, "channel");
cf.setIntProperty(WMQConstants.WMQ_PORT, 1411);
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, "queueManager");
context = cf.createContext();
} catch (JMSException e) {
e.printStackTrace();
}
return context;
}
}
解决方案
这段代码: -
mqDestination.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
在发送消息之前剥离消息属性。
您说您想使用“本机标头”而不是“MQRFH2”,但两者是完全可互换的。没有其中之一,这只是消息属性如何呈现给消息的接收者,这取决于它们如何能够使用它们。
如果你把消息属性和接收者在 RFH2 中要求它们,那么这就是他们将得到的。
如果您构建正确格式的 RFH2 标头并且接收器要求消息属性,那么这就是他们将得到的。
从您的应用程序中删除上述行,您的消息属性将流向接收器。
推荐阅读
- sql - 如何在本地模拟数据库链接?
- angular - Angular 拦截器等待 JWT 刷新完成
- 3d - 什么时候我应该同时缩放 gt 视差?【立体匹配】
- postgresql - 使用 PhpStorm 连接到 Postgres 容器
- forms - Vue JS 2 - Vuetify 和 Vulidate 打开模式
- r - 删除重复的组 dplyr r
- exchangelib - 使用 exchangelib 时发生错误时清除缓存
- go - CGO:将 Go 字节数组转换为 C char* 并返回,字节数组中出现空终止符
- java - 全屏背景,无论屏幕大小并保持图像纵横比
- excel - Excel - 使用 vlookup 自动更新值