【问题标题】:Remove "queue:///" from destination name Apache Camel + IBM MQ从目标名称 Apache Camel + IBM MQ 中删除“queue:///”
【发布时间】:2019-08-27 03:19:46
【问题描述】:

使用 apache camel 我将消息发送到 IBM Queue Q001IN,但在另一端,应用程序正在验证目的地,他们期望目的地为 Q001IN,但他们接收的是 queue:///Q001IN Q001IN.

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

无论如何我可以覆盖它以删除 queue:/// 吗?

我在下面尝试过,但它不起作用。

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

【问题讨论】:

  • 这里没有图片。 “另一端”一定是接收您写入队列的消息,而不是队列名称本身,对吧?
  • 是的,没错,他们正在接收消息,但为了验证消息,他们正在使用 `((Queue)getJMSDestination).getQueueName() 来检查它是否来自有效队列,

标签: apache-camel jms ibm-mq


【解决方案1】:

我认为其他应用程序正在使用 IBM MQ 特定 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:///&lt;Queue_Name&gt;

下面是输出

This is using JMS API456
JMSDestination : queue:///<Queue_Name>

当我尝试浏览使用 jms 发送的消息和使用 ibm mq 发送的其他消息时

两者的目的地不同,如下所示。

【讨论】:

    【解决方案2】:

    您的接收器应用程序接收到一个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();
    

    【讨论】:

      猜你喜欢
      • 2016-05-05
      • 2018-02-08
      • 2018-06-27
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 2015-04-22
      • 2018-12-28
      • 2020-11-27
      相关资源
      最近更新 更多