JMSCode使用数据库一对一发送和接收消息

时间:2019-02-06 12:34:00

标签: java jms ibm-mq

我去了多个站点并学习了JMS之后,我编写了一个JMS独立客户端,以从数据库中读取消息并逐一发送。我也想收到一条消息,然后更新数据库。 我需要使用标准JMS将消息发送到队列和其他应用程序,这将消耗TextMessage,并且其主体将作为ISO-8859-1字符串读取。同样,他们将以TextMessage的形式发送回复。 我编写了一个for循环来从数据库中逐一读取消息。

我不是JMS的新手,所以请您纠正我下面的代码是否正常工作以读取和发送消息到队列以及接收和更新数据库。是否需要更改JMS类型中的任何内容或需要更正的任何内容。 for循环工作正常吗?

/*MQ Configuration*/
MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
mqQueueConnectionFactory.setHostName(url);
mqQueueConnectionFactory.setChannel(channel);//communications link
mqQueueConnectionFactory.setPort(port);
mqQueueConnectionFactory.setQueueManager(qmgr);//service provider 
mqQueueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);

/*Create Connection */
QueueConnection queueConnection = mqQueueConnectionFactory.createQueueConnection();
queueConnection.start();

/*Create session */
QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

/*Create response queue */
//   Queue queue = queueSession.createQueue("QUEUE.RESPONSE");

int messageCount = 0;

Queue queue = queueSession.createQueue(replytoQueueName);
QueueSender queueSender = null;
QueueReceiver queueReceiver=null;

for (Testbean testBean : testbeanList) {
    String testMessage = testBean.getMessage();                 
    /*Create text message */
    textMessage = queueSession.createTextMessage(testMessage);

    logger.info("Text messages sent: " + messageCount);

    textMessage.setJMSReplyTo(queue);
    textMessage.setJMSType("mcd://xmlns");//message type
    textMessage.setJMSExpiration(2*1000);//message expiration
    textMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT); //message delivery mode either persistent or non-persistemnt

    /*Create sender queue */
    //  QueueSender queueSender = queueSession.createSender(queueSession.createQueue("QUEUE.REQEST"));

    queueSender = queueSession.createSender(queueSession.createQueue(outputQName));
    queueSender.setTimeToLive(2*1000);
    queueSender.send(textMessage);

    /*After sending a message we get message id */
    System.out.println("after sending a message we get message id "+ textMessage.getJMSMessageID());
    String jmsCorrelationID = " JMSCorrelationID = '" + textMessage.getJMSMessageID() + "'";


    /*Within the session we have to create queue reciver */
    queueReceiver = queueSession.createReceiver(queue,jmsCorrelationID);

    /*Receive the message from*/
    Message message = queueReceiver.receive(60*1000);
    //   String responseMsg = ((TextMessage) message).getText();

    byte[] by = ((TextMessage) message).getText().getBytes("ISO-8859-1");

    logger.info(new String(by));
    String responseMsg = new String(by,"UTF-8");

    testDAO rmdao = new testDAO();
    rmdao.updateTest(responseMsg, jmsCorrelationID);        

    messageCount += 1;
}

queueSender.close();
queueReceiver.close();
queueSession.close();
queueConnection.close();

1 个答案:

答案 0 :(得分:2)

事物的结合:

  • 我将创建您的QueueSender,并将Queue对象的发送消息发送到for循环的外部,因为它们似乎没有变化。< / li>
  • 没有相应的使用者代码,最终将无法判断选择器是否有效,但是在发送的消息上调用setCorrelationID() not 对我来说有点奇怪。使用提供者分配的消息ID可能是IBM MQ请求/答复应用程序的常见模式,但是使用相关ID的常规模式是在已发送的消息上调用setJMSCorrelationID()。这使代码更加清晰,并且还允许应用程序直接控制相关ID的唯一性。这对于应用程序的可移植性(例如,如果您从IBM MQ迁移到其他JMS提供程序)可能具有重要意义,因为不同的JMS提供程序使用特定于其特定实现的消息ID样式/格式。另外,对于JMS规范指出的消息ID,“唯一性的确切范围由提供者定义”,在我看来,这不足以保证唯一性,特别是在使用java.util.UUID.randomUUID().toString()之类的东西时是如此简单。
  • 您应该确保同时使用XA事务处理JMS和数据库,以确保它们是原子的。
  • finally块中关闭JMS资源。