2011-12-09 69 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()來使用隊列中的消息。