2011-12-09 13 views
0

Glassfish Webプロセスを実行していて、MessageDrivenBeanからメッセージを受信できるように非コンテナ管理クラス(EJBUserManager)が必要です。クラスにはjavax.jms.Queuesと接続ファクトリがあり、キューに書き込むことができます。キューは、コードを正しく受信したMessageDrivenBeanAccountValidatorBean)に送信し、メッセージを書き戻します。しかし、EJBUserManagerはキューからの読み取りを試み、メッセージを受信しません。JMSメッセージの消費がBeanの外部で発生していません

@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に送信できます。それはちょうど決してここを修正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

ためのコードですuserManagerQueue

から受け取りません。 QueueConnection.start()を呼び出して、キューからメッセージを消費する必要がありました。

関連する問題