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

问题描述 投票:0回答:1

之后,我去到多个站点,得知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();
java jms ibm-mq
1个回答
2
投票

事情夫妇:

  • 我想创建QueueSenderQueue反对其将消息发送到for循环之外,因为他们似乎并没有发生变化。
  • 如果没有相应的消费代码是最终不可能告诉我们,如果选择将工作或没有,但你发送消息不调用setCorrelationID()看起来有点怪我。使用提供商分配的消息ID可与IBM MQ请求的通用模式/应答的应用,但对于使用相关ID的一般模式是调用setJMSCorrelationID()所发送的消息。这使得代码更加清晰,并且还允许直接控制的相关性ID的唯一的应用程序。因为不同的JMS提供者使用样式/消息ID的格式特定于其特定的实施方式,这是用于应用程序的可移植性(例如,如果你从IBM MQ迁移到不同的JMS提供者)可能很重要。另外,关于消息标识的JMS规范指出,“唯一的确切范围定义供应商”,这在我看来是不是唯一的一个足够强大的保障使用类似java.util.UUID.randomUUID().toString()尤其是如此简单。
  • 你应该确保使它们的原子,您使用XA事务两者的JMS和数据库工作。
  • finally块闭上你的JMS资源。
© www.soinside.com 2019 - 2024. All rights reserved.