【问题标题】:Send message from MQ to EMS(JMS) queue将消息从 MQ 发送到 EMS(JMS) 队列
【发布时间】:2019-08-26 20:58:49
【问题描述】:

我想将 MQ 队列中的消息发送到不同服务器上的 EMS 队列。我不确定如何使用 Java 来做到这一点。如何确保发送消息时不会丢失任何消息。

我能够使用 java 使用来自 MQ 的消息。

try {
    // Create a connection factory
    JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
    JmsConnectionFactory cf = ff.createConnectionFactory();

    // Set the properties
    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, QMGR);
    cf.setStringProperty(WMQConstants.WMQ_APPLICATIONNAME, "JmsPutGet (JMS)");
    cf.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
    cf.setStringProperty(WMQConstants.USERID, APP_USER);
    cf.setStringProperty(WMQConstants.PASSWORD, APP_PASSWORD);

    // Create JMS objects
    context = cf.createContext();
    destination = context.createQueue("queue:///" + QUEUE_NAME);

    long uniqueNumber = System.currentTimeMillis() % 1000;
    TextMessage message = context.createTextMessage("Your lucky number today is " + uniqueNumber);

    producer = context.createProducer();
    producer.send(destination, message);
    System.out.println("Sent message:\n" + message);

    consumer = context.createConsumer(destination); // autoclosable
    String receivedMessage = consumer.receiveBody(String.class, 15000); // in ms or 15 seconds

    System.out.println("\nReceived message:\n" + receivedMessage);

    recordSuccess();
} catch (JMSException jmsex) {
    recordFailure(jmsex);
}

System.exit(status);

【问题讨论】:

    标签: java jms ibm-mq tibco-ems


    【解决方案1】:

    您的代码几乎是正确的,但是如果您想在程序中切换 JMS 提供程序,您还必须切换 JMS ConnectionFactory。这是创建消费者和消息的中心(特定于提供者)类。

    所以在创建上下文、生产者和消息的时候需要使用TIBCO的com.tibco.tibjms.naming.TibjmsInitialContextFactory,例如像这样:

    try {
    
      // 1) Create a MQ connection factory
      JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
      JmsConnectionFactory cf = ff.createConnectionFactory();
    
      // 2) Set the properties
      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, QMGR);
      cf.setStringProperty(WMQConstants.WMQ_APPLICATIONNAME, "JmsPutGet (JMS)");
      cf.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
      cf.setStringProperty(WMQConstants.USERID, APP_USER);
      cf.setStringProperty(WMQConstants.PASSWORD, APP_PASSWORD);
    
      // 3) Create MQ consumer
      JMSContext mqContext = cf.createContext();
      destination = mqContext.createQueue("queue:///" + QUEUE_NAME);
      consumer = mqContext.createConsumer(destination); // autoclosable
    
      // 4)  wait for message from MQ (or null)
      String receivedText = mqContext.receiveBody(String.class, 15000); // in ms or 15 seconds
      System.out.println("\nReceived message:\n" + receivedText);
    
      // 5) Create TIBCO EMS ConnectionFactory and an EMS MessageProducer
      TibjmsConnectionFactory emsCF = new com.tibco.tibjms.TibjmsConnectionFactory( "tcp://1.2.3.4:7222");
      Connection emsConnection = emsCF.createConnection(user, password);
      Session emsSession = emsConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
      MessageProducer emsProducer = emsSession.createProducer( emsSession.createQueue(QUEUE_NAME) );
    
      // 6) Create EMS TextMessage from MQ TextMessage
      TextMessage emsMsg = emsSession.createTextMessage( receivedText );
    
      // 7) publish to EMS
      emsProducer.send(emsMsg);
    
      // 8) cleanup
      emsConnection.close();
    
      recordSuccess();
    } catch (JMSException jmsex) {
       recordFailure(jmsex);
    }
    

    【讨论】:

    • 非常感谢您的回答。但我无法理解主要思想。我在 MQ 中有消息,我想在 EMS 中传输/发送这些消息。我如何才能从 MQ 读取数据并写入 EMS?
    • @Newbie 您需要将“创建 JMS 对象”下面的代码替换为上面的代码
    • @Newbie 您的 MQ 上下文将无法创建 EMS 消息或发送到 EMS 代理...
    • 感谢您的说明,感谢您的努力。我了解您提到的代码将连接并向 jms 队列发送消息。但我的实际问题是如何将消息从一个队列传输到另一个队列。
    • 有什么方法可以让我从 MQ 中读取而不是消费?
    猜你喜欢
    • 2016-05-02
    • 2016-01-11
    • 2011-01-11
    • 2016-12-10
    • 2012-06-05
    • 1970-01-01
    • 2013-05-22
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多