2011-11-21 89 views
1

我第一次使用JMS并使用Glassfish 3.1.1。我已成立了一个JMS连接工厂:JMS/Glassfish - 不消耗队列消息的MDB

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 

我已经部署了战争与接受一个文件,分析它,将内容保存到一个数据库,一个servlet 。如果这是所有成功的将消息发送到队列:

@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应当听取队列和actioning消息已部署的耳朵:

@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耳朵,它应该开始接收消息。有没有我错过的配置步骤?

有什么方法可以确认在servlet中生成的消息是否首先将其发送到队列中?在任何日志中都没有错误,包括server.log。

回答

2

您的bean不执行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") 
+0

您好,感谢您的建议。它实际上是在消费这个消息(我已经了解了非常方便的imqcmd实用程序)。这个问题与日志记录有关。 log4配置文件从ejb jar移动到耳朵中,我们失去了日志记录,所以它显示它没有使用这些消息。很好地捕捉到丢失的MessageListener接口。我已经添加了它,虽然它不在那里似乎没有影响任何东西。 – sdoca