JMS / Glassfish - MDB, die Warteschlangenmeldungen nicht konsumiert

  • Ich verwende zum ersten Mal JMS und verwende Glassfish 3.1.1. Ich habe eine JMS Connection Factory eingerichtet:

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

    und eine Zielressource:

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

    Ich habe einen Krieg mit einem Servlet implementiert, das eine Datei akzeptiert, sie analysiert und den Inhalt in einer Datenbank speichert. Wenn dies alles erfolgreich ist, wird eine Nachricht an die Warteschlange gesendet:

     @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();
    }
     

    Ich habe ein Ohr mit einem MDB, die die Warteschlange abhören und die Nachricht bearbeiten soll:

     @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);
                }
            }
        }
    }
     

    In meinen Kriegsprotokollen erhalte ich die

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

    Anweisung, aber in den Ohrprotokollen bekomme ich nichts, was darauf schließen lässt, dass die MDB die Nachricht empfängt .

    Ich verstehe, dass ich in der Lage sein sollte, das Ohr "nur" mit der MDB bereitzustellen, und es sollte mit dem Empfang der Nachrichten beginnen. Gibt es einen Konfigurationsschritt, den ich übersehen habe?

    Gibt es eine Möglichkeit zu bestätigen, dass die im Servlet generierte Nachricht überhaupt in die Warteschlange gelangt? Es gibt keine Fehler in einem Protokoll einschließlich server.log.

    22 November 2011
    sdocaSrikan
1 answer
  • Ihr Bean implementiert javax.jms.MessageListener nicht, es hat nur eine onMessage() -Methode mit derselben Signatur.

    Es ist auch möglich, dass Sie die activationConfig Teil der Anmerkung, aber ich bin mir nicht sicher, ob dies in Java EE 6 erforderlich ist. Sehen Sie nach, ob es der Fall ist:

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