Hi,
We have tried today to send message to MQ through
servlet and we are receiving message in the same servlet by QueueReceiver.receive() .We are succeeded in sending and receiving message in MQ by using servlet. Bu the same thing when we are trying by using session bean then it is hanging out for some time and getting time out exception.
As our session bean sends message in request queue then MDB heats,in this case is there any binding needed between session bean and MDB?
Asking because when servlet sends message in request queue then MDB heats successfully and QueueReceiver.receive() method in servlet got responce message in MQ.
Please advice.
Code for MDB:
package mq;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/**
* Bean implementation class for Enterprise Bean: EOBServiceProvider
*/
@MessageDriven(mappedName="EOBServiceProviderBean",
activationConfig = { @ActivationConfigProperty(
propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
// @ActivationConfigProperty(propertyName="destination", propertyValue="jms/QL.DEV.ODMF.EOB.REQ"),
// @ActivationConfigProperty(propertyName="acknowledgeMode", propertyValue="Auto-acknowledge"),
// @ActivationConfigProperty(propertyName="subscriptionDurability", propertyValue="Durable")
})
public class EOBServiceProviderBean implements javax.jms.MessageListener {
/**
* onMessage
*/
public void onMessage(javax.jms.Message msg) {
System.out.println("EOBServiceProviderBean.onMessage()");
try {
TextMessage txtMsg = null;
if (msg instanceof TextMessage) {
txtMsg = (TextMessage) msg;
}
String eobRequestXML = txtMsg.getText();
System.out.println("eobRequestXML : "+eobRequestXML);
senMsg(txtMsg);
} catch (Exception e) {
e.printStackTrace();
// Log this exception and return a code -1
}
}
private void senMsg(TextMessage msg){
System.out.println("EOBServiceProviderBean.senMsg()");
InitialContext initialContext=null;
Queue resQueue =null;
QueueConnectionFactory queueConnectionFactory=null;
QueueConnection queueConnection = null;
QueueSender sender=null;
QueueSession queueSession =null;
try {
initialContext = new InitialContext();
queueConnectionFactory = (QueueConnectionFactory) initialContext.lookup("jms/MQDEVEOBQCF");
System.out.println("msg sent in MDB : "+msg.getText());
queueConnection = queueConnectionFactory.createQueueConnection();
queueConnection.start();
queueSession = queueConnection.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
resQueue = (Queue) initialContext.lookup("jms/QR.DEV.ODMF.EOB.RES");
sender = queueSession.createSender(resQueue);
System.out.println("in MDB : Before sender.send...");
sender.send(msg);
System.out.println("in MDB : After sender.send...");
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Code for Session Bean:
package mq;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import java.text.StringCharacterIterator;
import javax.ejb.Stateless;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.xml.rpc.ServiceException;
import javax.xml.soap.SOAPElement;
import org.xml.sax.SAXParseException;
/**
* Bean implementation class for Enterprise Bean: DocumentSearchManager
*/
@Stateless
public class DocumentSearchManagerBean implements DocumentManager{
private QueueConnection connection = null;
@Override
public String findEOB(String eobRequestXML) {
String eobResponseXML = null;
try {
System.out.println("DocumentSearchManagerBean.findEOB()");
eobResponseXML = sendReceive(eobRequestXML);
} catch (Exception e) {
e.printStackTrace();
}
//return ODMFUtils.parseResponseXML(eobResponseXML);
return eobResponseXML;
}
private String sendReceive(String requestMessage, boolean eob) throws Exception {
System.out.println("requestMessage : " + requestMessage);
String returnString = null;
QueueSession session = null;
QueueConnectionFactory connectionFactory = null;
System.out.println("DocumentSearchManagerBean.sendReceive()");
try {
if (connection == null) {
InitialContext initialContext = new InitialContext();
connectionFactory = (QueueConnectionFactory) initialContext.lookup("jms/MQDEVEOBQCF");
connection = connectionFactory.createQueueConnection();
}
try {
connection.start();
} catch (Exception e) {
e.printStackTrace();
}
session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
System.out.println("Before send....");
sendMessage(session, requestMessage, eob);
System.out.println("After send...");
returnString = receiveMessage(session);
System.out.println("returnString : " + returnString);
}
catch (JMSException ex) {
throw ex;
} catch (NamingException ne) {
} catch (Exception ex) {
} finally {
if (session != null) {
session.close();
}
}
return returnString;
}
private voidsendMessage(QueueSession session, String messageString) throws Exception {
QueueSender sender = null;
Queue queue = null;
InitialContext initialContext = new InitialContext();
try {
// senderQueue = (Queue) getObjectByJNDILookup(QUEUE_SENDER_JNDI_NAME, false);
if (eob) {
queue = (Queue) initialContext.lookup("jms/QL.DEV.ODMF.EOB.REQ");
}
sender = session.createSender(queue);
sender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
TextMessage message = session.createTextMessage();
message.setText(messageString);
sender.send(message);
} catch (JMSException e) {
throw e;
} finally {
if (sender != null) {
sender.close();
}
}
}
private String receiveMessage(QueueSession session) throws Exception {
QueueReceiver receiver = null;
InitialContext initialContext = new InitialContext();
Queue queue = null;
System.out.println("DocumentSearchManagerBean.receiveMessage()");
try {
if (eob) {
queue = (Queue) initialContext.lookup("jms/QR.DEV.ODMF.EOB.RES");
}
receiver = session.createReceiver(queue);
System.out.println("Before receive...");
TextMessage msg = (TextMessage) receiver.receive();
System.out.println("After receive...");
String returnString = msg.getText();
return returnString;
}catch (JMSException e) {
throw e;
} finally {
if (receiver != null) {
receiver.close();
}
}
}
}