Я использую JMS впервые и использую Glassfish 3.1.1. Я установил фабрику соединений JMS:
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
Я развернул войну с сервлетом, который принимает файл, анализирует его и сохраняет содержимое в базе данных. Если это все успешно, он отправляет сообщение в очередь:
@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, которое должно прослушивать очередь и обрабатывать сообщение:
@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, и он должен начать получать сообщения. Есть ли шаг конфигурации, который я пропустил?
Есть ли какой-нибудь способ подтвердить, что сообщение, сгенерированное в сервлете, в первую очередь попадает в очередь? Нет ошибок ни в одном журнале, включая server.log.