gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:40:15 24 4
gpt4 key购买 nike

在我访问了多个站点并学习了 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();

最佳答案

有几件事:

  • 我会创建你的QueueSenderQueue反对向for外部发送消息循环,因为它们似乎没有改变。
  • 如果没有相应的消费者代码,最终无法判断选择器是否有效,但不能调用 setCorrelationID()你发送的消息对我来说看起来有点奇怪。使用提供者分配的消息 ID 可能是 IBM MQ 请求/回复应用程序的常见模式,但使用相关 ID 的一般模式是调用 setJMSCorrelationID()在发送的消息上。这使得代码更加清晰,也允许应用程序直接控制关联ID的唯一性。这对于应用程序可移植性(例如,如果您从 IBM MQ 迁移到不同的 JMS 提供程序)可能很重要,因为不同的 JMS 提供程序使用特定于其特定实现的消息 ID 样式/格式。另外,关于消息 ID,JMS 规范指出,“唯一性的确切范围是由提供者定义的”,在我看来,这并不能充分保证唯一性,尤其是在使用类似 java.util.UUID.randomUUID().toString() 之类的内容时。就是这么简单。
  • 您应该确保对 JMS 和数据库工作使用 XA 事务,以便它们具有原子性。
  • 关闭 finally 中的 JMS 资源阻止。

关于java - JMSCode使用数据库一一发送和接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54553785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com