Glassfish JMS消息消耗不是';不可能发生在豆子外面
我正在运行一个Glassfish web进程,我需要一个非容器管理类(Glassfish JMS消息消耗不是';不可能发生在豆子外面,glassfish,queue,jms,Glassfish,Queue,Jms,我正在运行一个Glassfish web进程,我需要一个非容器管理类(EJBUserManager),以便能够从MessageDrivenBean接收消息。这个类有javax.jms.Queues和连接工厂,我可以写入队列。队列发送到正确接收代码的MessageDrivenBean(AccountValidatorBean),然后写回消息。但是,EJBUserManager尝试从队列中读取,但从未收到消息 @Override public boolean doesExist(String use
EJBUserManager
),以便能够从MessageDrivenBean
接收消息。这个类有javax.jms.Queues
和连接工厂,我可以写入队列。队列发送到正确接收代码的MessageDrivenBean
(AccountValidatorBean
),然后写回消息。但是,EJBUserManager
尝试从队列中读取,但从未收到消息
@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();
}
}
}
}
固定的。我需要调用QueueConnection.start()来使用队列中的消息