我正在使用JMS将消息放入队列。
队列与2个QueueConnection工厂和2个队列管理器相关联。 在将消息发送到队列时,我希望通过2个不同的队列连接工厂向2个不同的队列管理器平均分发/发送消息。
示例:
在不同的时间点, 我的服务接收来自某个用户的消息。我需要同样将消息放入2个QCF / QueueManagers。(负载平衡)
如果我收到第一条消息,我需要发送到第一个QCF1 /队列管理器,如果另一个消息到达我的服务,我将不得不将它发送到第二个QCF1 /队列管理器。
因为JMS允许我一次使用onle 1 QCF创建Queue Coontion。
这可以使用JMS完成吗?还是另一种方法来实现这个目标?
使用一个QCF向队列发送消息的方法:
import javax.naming.InitialContext;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.QueueSession;
import javax.jms.QueueSender;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
public class Receiver
{
@Resource(lookup = "jms/ConnectionFactory1")
private static QueueConnectionFactory connectionFactory1;
@Resource(lookup = "jms/ConnectionFactory2")
private static QueueConnectionFactory connectionFactory2;
@Resource(lookup = "jms/Queue")
private static Queue queue;
public void readQueueMessages() {
try {
// create a queue connection
QueueConnection queueConn = connectionFactory1.createQueueConnection();
// create a queue session
QueueSession queueSession = queueConn.createQueueSession(true, 0);
// create a queue receiver
QueueSender queueSender = queueSession.createSender(queue);
TextMessage msg = queueSession.createTextMessage();
// start the connection
queueConn.start();
msg.setText("Hi");
queueSender.send(msg);
queueSender.close();
queueSession.close();
queueConn.close();
}
} catch(JMSException exp) {
// Handle this exception
} finally {
if(queueConn != null) {
// close the queue connection
queueConn.close();
}
}
}
}
答案 0 :(得分:1)
由于您提到了负载平衡,因此最好使用IBM MQ队列管理器群集,而不是使用您自己的代码来分发消息。您需要将队列管理器放在MQ集群中,并在QM1和QM2中定义集群队列的实例,如下所示。
当发往CLUSQ1的消息到达QM网关时,队列管理器将使用默认循环方法将消息路由到集群中的其他队列管理器。
阅读here以获取有关MQ群集的更多信息