JMS messaging question
I'm having some trouble with JMS messages. I have the following method
to put a message to a SonicMQ queue via JMS and I want to read the response
message that comes back. I am putting the message successfully, but the
code times out every time when trying to get the response. If anyone can see
something I have wrong in the code, please let me know. I'm new to JMS so I
assume that I'm missing something very basic. The getCorrelationId method
just creates a correlation id based on some literals and a timestamp.
public String sendXml(String pXML) throws ConnectionException {
if (pXML == null)
throw new ConnectionException("No XML data was entered.");
String correlationId = null;
try {
QueueSession queueSession =
mQueueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueSender queueSender = queueSession.createSender(mQueue);
TextMessage message = queueSession.createTextMessage();
message.setJMSReplyTo((Queue)mJndiContext.lookup(mResponseQueue));
message.setJMSExpiration(mTimeout);
correlationId = getCorrelationId(1);
message.setJMSCorrelationID(correlationId);
message.setText(pXML);
queueSender.send(message, DeliveryMode.PERSISTENT,
Message.DEFAULT_PRIORITY, mTimeout);
String JMSCorrelationId = message.getJMSMessageID();
} catch (JMSException e) {
throw new ConnectionException("Got JMS exception trying to
connect to the queue " + mQueue + ".");
} catch (NamingException ne) {
throw new ConnectionException("Got naming exception trying to
lookup queue " + mQueue + ".");
}
try {
QueueSession queueSession =
mQueueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue receiveQueue = (Queue)mJndiContext.lookup(mResponseQueue);
QueueReceiver queueReceiver =
queueSession.createReceiver(receiveQueue, correlationId);
Message msg = queueReceiver.receive(mTimeout);
if (msg != null) {
String textMsg = null;
if (msg instanceof TextMessage) {
return ((TextMessage) msg).getText().toString();
} else if (msg instanceof BytesMessage) {
ByteArrayOutputStream bytes = new
ByteArrayOutputStream();
byte[] byteBuffer = new byte[1024];
int read = 0;
while ((read = ((BytesMessage)
msg).readBytes(byteBuffer)) != -1) {
bytes.write(byteBuffer, 0, read);
}
return new String(bytes.toByteArray());
} else {
throw new ConnectionException("Did not receive a
readable message.");
}
} else {
throw new ConnectionException("Did not receive a response in
the time allotted.");
}
} catch (JMSException e) {
throw new ConnectionException("Got JMS exception trying to
connect to the queue " + mResponseQueue + ".");
} catch (NamingException ne) {
throw new ConnectionException("Got naming exception trying to
lookup queue " + mResponseQueue + ".");
}
}