之后,我去到多个站点,得知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();
事情夫妇:
QueueSender
和Queue
反对其将消息发送到for
循环之外,因为他们似乎并没有发生变化。setCorrelationID()
看起来有点怪我。使用提供商分配的消息ID可与IBM MQ请求的通用模式/应答的应用,但对于使用相关ID的一般模式是调用setJMSCorrelationID()
所发送的消息。这使得代码更加清晰,并且还允许直接控制的相关性ID的唯一的应用程序。因为不同的JMS提供者使用样式/消息ID的格式特定于其特定的实施方式,这是用于应用程序的可移植性(例如,如果你从IBM MQ迁移到不同的JMS提供者)可能很重要。另外,关于消息标识的JMS规范指出,“唯一的确切范围定义供应商”,这在我看来是不是唯一的一个足够强大的保障使用类似java.util.UUID.randomUUID().toString()
尤其是如此简单。finally
块闭上你的JMS资源。