我正在使用IBM MQ在通过客户端的消费者接收消息时生成消息。要创建我使用JmsConnectionFactory
的连接,以及提供的属性来设置与服务器的连接。因此,根据我的理解,作为消费者,识别服务器产生的消息的唯一方法是通过onMessage
调用。我目前正在通过创建本地生产者和本地消费者来测试这一点,并确保消费者接收生产者发送的每条消息。
我遇到了以下问题:
以下是创建生产者的代码:
JmsConnectionFactory cf = ff.createConnectionFactory();
cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, qm.getHost());
int port = ###;
cf.setIntProperty(WMQConstants.WMQ_PORT, port);
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, qm.getChannel());
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, qm.getQueueManagerName());
Connection connection = cf.createConnection(qm.getUser().getUsername(), qm.getUser().getPassword());
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue(qm.getDestinationName());
LOG.debug("Destination Created at " +qm.getDestinationName());
msgSender = session.createProducer(destination);
msgSender.setDeliveryMode(DeliveryMode.PERSISTENT);
这就是制片人发送信息的方式:
/**
* msgSender is the MessageProducer object
**/
private void produceMessages(int numOfMessages) throws JMSException, InterruptedException {
for (int i = 0; i < numOfMessages; i++) {
String text = "Message #" +i;
TextMessage message = session.createTextMessage(text);
msgSender.send(message);
}
}
在消费者方面,我只是打印收到的消息并进行视觉验证:
@Override
public void onMessage(Message m) {
System.out.println(((TextMessage)m).getText());
}
我不完全熟悉IBM MQ的工作原理。丢失消息的原因是否驻留在MQ上,只是忽略了在完全发送消息之前生成的消息?
答案 0 :(得分:0)
我想说问题出在你的消费者一方,而不是你的模拟制作人。您的消息生产者应该正好向MQ发送消息,但是多个消费者可能正在竞争从您设置的连接中检索这些消息(给定相同的队列管理器属性)。因此,除非没有其他人试图从您的IBM MQ中消费,否则您将会错过一些消息。
答案 1 :(得分:0)
您应该使用send(Message m, CompletionListener l)
的其他方法仅在完成后发送新消息。
而且,如果您使用“尽力而为”,它仍然会丢失消息。您可以改用“快速”。