2011-12-09 91 views
0

我正在运行Glassfish Web进程,并且需要非容器管理的类(EJBUserManager)才能够接收来自MessageDrivenBean的消息。该类有javax.jms.Queues和连接工厂,我可以写入队列。队列发送到正确接收代码的MessageDrivenBeanAccountValidatorBean),然后写回消息。但EJBUserManager尝试从队列中读取并从不接收消息。JMS消息消费不在豆的外部发生

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

回答

0

固定的代码。我需要调用QueueConnection.start()来使用队列中的消息。