使用apache camel我正在向IBM Queue Q001IN
发送mesasge,但在另一端,应用程序正在验证目标,并且他们期望目标为Q001IN
,但是它们正在接收队列:/// Q001IN而不是Q001IN。
...
.to("jms:Q001IN")
.end()
无论如何我可以覆盖它来删除queue:///?
我在下面试过,但它不起作用。
.setHeader("destination", simple("QUEUE_NAME"))
.setHeader("destinationName", simple("QUEUE_NAME"))
.to("jms:Q001IN")
您的接收器应用程序准确地接收JMS Destination对象,JMS Queue。你看到的“queue:///”是该对象的toString()。如果要获取队列名称,则必须(不幸的是)将目标对象强制转换为javax.jms.Queue
,然后使用方法Queue.getQueueName()
。我不确定你的接收应用程序,但是让我们说dest包含你收到的消息的JMSDestination:
import javax.jms.Queue
Queue q = (Queue)dest;
String qName = q.getQueueName();
我认为其他应用程序正在使用IBM MQ Specific API和Headers。这就是他们只能检索队列名称的原因。如果我使用下面发送消息,他们可以接收没有队列的队列名称:///
Hashtable<String, Object> properties = new Hashtable<String, Object>();
properties.put(MQConstants.HOST_NAME_PROPERTY, HOST);
properties.put(MQConstants.PORT_PROPERTY, new Integer(PORT));
properties.put(MQConstants.CHANNEL_PROPERTY, CHANNEL);
MQQueueManager queueManager = new MQQueueManager(QUEUE_MANAGER, properties);
int openOptions = MQConstants.MQOO_INPUT_AS_Q_DEF | MQConstants.MQOO_OUTPUT;
com.ibm.mq.MQQueue ibmQueue = queueManager.accessQueue(QUEUE_NAME, openOptions);
MQMessage msg = new MQMessage();
MQRFH2 rfh2 = new MQRFH2();
rfh2.setFieldValue("mcd", "Msd", "jms_text");
rfh2.setFieldValue("jms", "Dst", QUEUE_NAME);
rfh2.write(msg);
msg.writeString("This is using IBM API : " + System.currentTimeMillis() % 1000);
msg.format = CMQC.MQFMT_RF_HEADER_2;
MQPutMessageOptions pmo = new MQPutMessageOptions();
ibmQueue.put(msg, pmo);
即使我使用如下的JMS API。
JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactory cf = ff.createConnectionFactory();
cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, HOST);
cf.setIntProperty(WMQConstants.WMQ_PORT, PORT);
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, CHANNEL);
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, QUEUE_MANAGER);
cf.setStringProperty(WMQConstants.WMQ_APPLICATIONNAME, "JmsPutGet (JMS)");
cf.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
cf.setStringProperty(WMQConstants.USERID, APP_USER);
JMSContext context = cf.createContext();
Queue destination = context.createQueue(QUEUE_NAME);
TextMessage message = context.createTextMessage("This is using JMS API" + System.currentTimeMillis() % 1000);
JMSProducer producer = context.createProducer();
producer.send(destination, message);
System.out.println("Sent message:\n" + message);
System.out.println("JMSDestination : " + ((Queue) message.getJMSDestination()).getQueueName());
并尝试将目标放入队列并获取我得到的队列名称
queue:///<Queue_Name>
以下是输出
This is using JMS API456
JMSDestination : queue:///<Queue_Name>
当我试图浏览使用jms和其他使用ibm mq发送的消息时
两者的目的地不同,如下所示。