Удалите «queue: ///» из имени назначения Apache Camel + IBM MQ - PullRequest
0 голосов
/ 05 апреля 2019

Используя apache camel, я отправляю сообщение в IBM Queue Q001IN, но на другом конце приложение проверяет адрес назначения, и они ожидают пункт назначения как Q001IN, однако вместо этого они получают как очередь: /// Q001INQ001IN.

...
.to("jms:Q001IN")
.end()

Есть ли в любом случае, я могу переопределить это, чтобы удалить очередь: ///?

Я пробовал ниже, но это не работает.

.setHeader("destination", simple("QUEUE_NAME"))
.setHeader("destinationName", simple("QUEUE_NAME"))
.to("jms:Q001IN")

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Ваше приложение получателя получает объект 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();
0 голосов
/ 05 апреля 2019

Я думаю, что другие приложения используют IBM MQ Specific API и заголовки.По этой причине они могут получить только имя очереди.Если я отправляю сообщение, используя ниже, они могут получить имя очереди без очереди: ///

    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

Место назначения для обоих вариантов отличается, как показано ниже.

enter image description here

...