Гарантирует ли JMS receiveNoWait() доставку сообщений, когда сообщения доступны?

Здравствуйте, я пишу какой-то простой сценарий тестирования, где я выполняю следующий исходный код:

Вот мой метод send():

public void send() throws JMSException {

    Session session = null;
    MessageProducer producer = null;

    try {
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        Destination destination = session.createQueue("TEST.FOO");

        producer = session.createProducer(destination);
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

        byte[] uselessData = new byte[1024];

        BytesMessage message = session.createBytesMessage();
        message.writeBytes(uselessData);

        producer.send(message);

    } finally {
        producer.close();
        session.close();
    }
}

Вот мой метод receive():

public void receive() throws JMSException {

    Session session = null;
    MessageConsumer consumer = null;

    try {
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createQueue("TEST.FOO");
        consumer = session.createConsumer(destination);

        Message hugeMessage = consumer.receiveNoWait();

        if (hugeMessage == null) {
            System.out.println("Message was not received");
            unsucsesfullCount++;
        } else {
            if (hugeMessage instanceof BytesMessage) {
                System.out.println("Message received");
            }
        }
    } finally {
        consumer.close();
        session.close();
    }

}

Я выполняю:

send();
receive();

Значение сообщения после receiveNoWait() всегда равно нулю.

Мой вопрос здесь заключается в том, гарантирует ли ReceiveNoWait () доставку сообщений при наличии сообщений в брокере? Функция send() выполнена успешно, поэтому в месте назначения есть хотя бы одно сообщение.

Я искал в спецификации, но нет действительно четкого определения, должно ли сообщение, которое доступно на стороне брокера, быть явно получено методом receiveNoWait() на стороне клиента.

Также я хочу спросить, если receiveNoWait() не имеет доступного сообщения, должно ли это инициировать некоторый процесс обновления потребителя в брокере, так что следующее receiveNoWait() получит сообщение?

Пример кода, который я предоставил, работает на ActiveMQ, но мой вопрос более концептуален, чем специфический для провайдера, потому что у меня есть то же наблюдение для других провайдеров JMS.

1 ответ

Решение

Нет, спецификация не гарантирует, что любой вызов receiveNoWait вернет сообщение, может, а потом снова может и нет. Когда используешь receiveNoWait Вы всегда должны проверять нулевой возврат и действовать соответственно.

В случае ActiveMQ клиент вернет сообщение, если брокер отправил ему сообщение, и оно сразу же доступно в буфере предварительной выборки потребителя, в противном случае он просто возвращает ноль.

Другие реализации действительно отправляют запрос опроса брокеру, например, Qpid JMS использует запрос утечки ссылки AMQP, чтобы попросить, чтобы брокер отправил ему любые сообщения, доступные для отправки, и брокер либо отправит их, либо сообщит, что ссылка удалена и нет готовых сообщений.

Короче говоря, это полностью зависит от клиента и брокера, как они реализуют receiveNoWait но независимо от того, что вам всегда нужно учитывать, существует вероятность того, что вы не получите сообщение, возвращенное вам этим методом.

Другие вопросы по тегам