IBM MQ无法发送/接收所有JMS消息

时间:2016-07-27 20:14:55

标签: java jms ibm-mq

我正在使用IBM MQ在通过客户端的消费者接收消息时生成消息。要创建我使用JmsConnectionFactory的连接,以及提供的属性来设置与服务器的连接。因此,根据我的理解,作为消费者,识别服务器产生的消息的唯一方法是通过onMessage调用。我目前正在通过创建本地生产者和本地消费者来测试这一点,并确保消费者接收生产者发送的每条消息。

我遇到了以下问题:

  1. 我没有收到所有邮件。
  2. 根据消息的大小,如果消息较小,则会收到更多消息。
  3. 以下是创建生产者的代码:

    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上,只是忽略了在完全发送消息之前生成的消息?

2 个答案:

答案 0 :(得分:0)

我想说问题出在你的消费者一方,而不是你的模拟制作人。您的消息生产者应该正好向MQ发送消息,但是多个消费者可能正在竞争从您设置的连接中检索这些消息(给定相同的队列管理器属性)。因此,除非没有其他人试图从您的IBM MQ中消费,否则您将会错过一些消息。

答案 1 :(得分:0)

您应该使用send(Message m, CompletionListener l)的其他方法仅在完成后发送新消息。 而且,如果您使用“尽力而为”,它仍然会丢失消息。您可以改用“快速”。