JMS / Glassfish - MDB не использует сообщения очереди - PullRequest
1 голос
/ 22 ноября 2011

Я использую JMS впервые и использую Glassfish 3.1.1. Я установил фабрику соединений JMS:

Pool Name: jms/QueueConnectionFactory
JNDI Name: jms/QueueConnectionFactory
Resource Type: javax.jms.QueueConnectionFactory

и ресурс назначения:

JNDI Name: jms/ProcessBatchQueue
Physical Destination: ProcessBatchQueue
Resource Type: javax.jms.Queue

Я развернул войну с сервлетом, который принимает файл, анализирует его и сохраняет содержимое в базе данных. Если это все успешно, он отправляет сообщение в очередь:

@Resource(lookup = "jms/ProcessBatchQueue")
private Queue processBatchQueue;

private void sendProcessBatchMessage(String batchID) throws JMSException
{
    log.info("Attempting to send process batch message for batch ID: "
            + batchID);

    Connection jmsConnection = connectionFactory.createConnection();
    Session jmsSession = jmsConnection.createSession(false,
            Session.AUTO_ACKNOWLEDGE);

    TextMessage message = jmsSession.createTextMessage();
    message.setText(batchID);

    MessageProducer msgProducer = jmsSession.createProducer(processBatchQueue);
    msgProducer.send(message);

    jmsConnection.close();
}

У меня есть развернутое ухо с MDB, которое должно прослушивать очередь и обрабатывать сообщение:

@MessageDriven(mappedName = "jms/ProcessBatchQueue")
public class BatchReceiver
{
    private final Logger log = LoggerFactory.getLogger(BatchReceiver.class);

    public void onMessage(Message message)
    {
        log.info("Received message from jms/ProcessBatchQueue: " + message);

        try
        {
            if (message instanceof TextMessage)
            {
                String batchId = ((TextMessage) message).getText();
                // do processing
            }
            else
            {
                log.error("Received invalid message type from jms/ProcessBatchQueue");
            }
        }
        catch (Exception ex)
        {
            String error = "Received error '" + ex.toString()
                    + "' retrieving message from jms/BatchProcessingTopic.";

            Throwable linkedEx = ex.getCause();

            if (linkedEx != null)
            {
                log.error(error += "Linked exception: " + linkedEx.getMessage(),
                    linkedEx);
            }
            else
            {
                log.error(error + ", " + ex.getMessage(), ex);
            }
        }
    }
}

В моих военных журналах я получаю

log.info("Attempting to send process batch message for batch ID: " + batchID);

, но в ушных журналах я не получаю ничего, что указывало бы на то, что MDB получает сообщение.

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

Есть ли какой-нибудь способ подтвердить, что сообщение, сгенерированное в сервлете, в первую очередь попадает в очередь? Нет ошибок ни в одном журнале, включая server.log.

1 Ответ

2 голосов
/ 23 ноября 2011

Ваш компонент не реализует javax.jms.MessageListener, он просто имеет метод onMessage() с такой же сигнатурой.

Также возможно, что вы пропустили часть activationConfig аннотации, но я не уверен, требуется ли это в Java EE 6. Посмотрите, так ли это в любом случае:

@MessageDriven(
    activationConfig = { 
            @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
            @ActivationConfigProperty(propertyName = "destination", propertyValue = "ProcessBatchQueue")},
    mappedName = "jms/ProcessBatchQueue")
...