Потребление сообщений JMS не происходит вне компонента - PullRequest
0 голосов
/ 10 декабря 2011

Я выполняю веб-процесс Glassfish и мне нужен неконтейнерный управляемый класс (EJBUserManager), чтобы иметь возможность получать сообщения от MessageDrivenBean.В классе есть javax.jms.Queues и фабрики соединений, и я могу писать в очереди.Очередь отправляет на MessageDrivenBean (AccountValidatorBean), который правильно принимает код, а затем записывает сообщение обратно.Но EJBUserManager пытается прочитать из очереди и никогда не получает сообщение.

@Override
public boolean doesExist(String username) throws FtpException {
    LOGGER.finer(String.format("Query if username %s exists", username));

    QueueConnection queueConnection = null;
    boolean doesExist = false;

    try {
        queueConnection = connectionFactory.createQueueConnection();
        final UserManagerMessage userManagerMessage = 
            new UserManagerMessage(UserManagerQueryCommands.VALIDATE_USER, username);
        final Session session = queueConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        final ObjectMessage objectMessage = session.createObjectMessage(userManagerMessage);
        session.createProducer(accountValidatorQueue).send(objectMessage);
        session.close();
        queueConnection.close();
        queueConnection = connectionFactory.createQueueConnection();
        final QueueSession queueSession = 
            queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

        LOGGER.finest(String.format("Right before doesExist receive for username %s", username));
        final Message firstAttemptMessage = queueSession.createConsumer(userManagerQueue).receive(3000);
        final Message message = firstAttemptMessage != null ? 
                firstAttemptMessage : queueSession.createConsumer(userManagerQueue).receiveNoWait();
        LOGGER.finest(String.format("Right after doesExist receive for username %s", username));
        LOGGER.finest(String.format("Is the message null: %b", message != null));
        if (message != null && message instanceof StreamMessage) {

            final StreamMessage streamMessage = (StreamMessage) message;
            doesExist = streamMessage.readBoolean();
        }

    } catch (JMSException e) {
        e.printStackTrace();
    } finally {
        if (queueConnection != null) {
            try {
                queueConnection.close();
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }

    return doesExist;
}

Выше приведен код из EJBUserManager.Теперь его можно отправить на accountValidatorQueue.Он просто никогда не получает от userManagerQueue

Вот код для AccountValidatorBean

private void validateUser(final String username) {
    QueueConnection queueConnection = null;
    final String doctype = doctypeLookupDAO.getDocumentTypeForUsername(username);
    LOGGER.finest(String.format("Doctype %s for username %s", doctype, username));


    try {
        queueConnection = queueConnectionFactory.createQueueConnection();
        final Session session = queueConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);


        //final StreamMessage message = session.createStreamMessage();
        //message.clearBody();
        //message.writeBoolean(doctype != null);
        //message.reset();
        final ObjectMessage message = session.createObjectMessage(Boolean.valueOf(doctype != null));

        final MessageProducer messageProducer = 
            session.createProducer(userManagerQueue);
        LOGGER.finest(String.format("Queue name %s of producing queue", userManagerQueue.getQueueName()));
        messageProducer.send(message);

        LOGGER.finest(String.format("Sending user validate message for user %s", username));
        messageProducer.close();
        session.close();
    } catch (JMSException e) {
        e.printStackTrace();

    } finally {
        if (queueConnection != null) {
            try {
                queueConnection.close();
            } catch (JMSException e1) {
                e1.printStackTrace();
            }
        }
    }
}

1 Ответ

0 голосов
/ 12 декабря 2011

Fixed. Мне нужно было вызвать QueueConnection.start () для получения сообщений из очереди.

...