QueueReceiver class doesn't work when JBoss manage JMS resou
eddy Sep 19, 2001 12:04 PMAm I able to use the QueueReceiver.receive() method inside a statless bean for which JBoss managed the JMS resource? I knew I can use MDB instead; however, MDB is not allow to set message selector to receive a specific message. I am using JBoss-2.4.1. The following is my code. When I call the QueueReceiver.receive() method inside my remove() method, it simply hung.
Thanks in advance!
import java.rmi.*; import javax.ejb.*; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueSession; import javax.jms.QueueConnectionFactory; import javax.jms.QueueSender; import javax.jms.QueueReceiver; import javax.jms.QueueBrowser; import javax.jms.JMSException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.jms.Message; import javax.jms.TextMessage; import javax.jms.ObjectMessage; import javax.jms.Session; import java.util.Enumeration; import java.io.Serializable; import java.util.Vector; import java.util.HashMap; import com.seitel.gos.util.GOSConstant; import javax.jms.MessageListener; public class QueueManagerSLB implements SessionBean { private SessionContext sessionContext; private static final String QUEUE_CONNECTION_FACTORY_JNDI = "java:comp/env/jms/QueueConnectionFactory"; private static final String QUEUE_JNDI = "java:comp/env/jms/Queue"; private long m_timeToLive = 400000; private QueueConnection m_qeueConn = null; private Queue m_queue = null; private boolean DEBUG_ON = true; private void debug(Object mesg){ if (DEBUG_ON) System.out.println("DEBUG: QueueManagerSLB: " + mesg); } public void ejbCreate() throws CreateException{ try{ Context ctx = new InitialContext(); this.m_queue = (Queue)ctx.lookup(QUEUE_JNDI); QueueConnectionFactory qFactory = (QueueConnectionFactory)ctx.lookup( QUEUE_CONNECTION_FACTORY_JNDI); this.m_qeueConn = qFactory.createQueueConnection(); }catch(NamingException namex){ throw new CreateException(namex.getMessage()); }catch(JMSException jmsex){ throw new CreateException("JMS Error Code: " +jmsex.getErrorCode()+ jmsex.getMessage()); } } public void ejbRemove() throws RemoteException { if (this.m_qeueConn != null){ try{ this.m_qeueConn.close(); }catch(JMSException jmsex){ jmsex.printStackTrace(); } } } public void ejbActivate() throws RemoteException { } public void ejbPassivate() throws RemoteException { } public void setSessionContext(SessionContext sessionContext) throws RemoteException { this.sessionContext = sessionContext; } public void add(HashMap info,int deliveryMode, int priority){ QueueSession qSession = null; try{ qSession = this.m_qeueConn.createQueueSession(true, Session.AUTO_ACKNOWLEDGE); QueueSender qSender = qSession.createSender(this.m_queue); //this.debug("Default delivery Mode: " + qSender.getDeliveryMode()); //this.debug("Default Priority : " + qSender.getPriority()); //this.debug("Default Time to Live : " + qSender.getTimeToLive()); ObjectMessage objMessage = qSession.createObjectMessage(); objMessage.setJMSCorrelationID((String)info.get( GOSConstant.TRANSACTION_ID)); objMessage.setObject(info); qSender.send(objMessage,deliveryMode,priority,this.m_timeToLive); }catch(JMSException jmsex){ this.sessionContext.setRollbackOnly(); throw new EJBException(jmsex); }finally{ if (qSession != null){ try{ qSession.close(); }catch(JMSException jmsex){ jmsex.printStackTrace(); } } } } public Vector list(){ QueueSession qSession = null; try{ qSession = this.m_qeueConn.createQueueSession(true, Session.AUTO_ACKNOWLEDGE); QueueBrowser qBrowser = qSession.createBrowser(this.m_queue); Enumeration enu = qBrowser.getEnumeration(); Vector tmp = new Vector(); Message m = null; while(enu.hasMoreElements()){ m = (Message)enu.nextElement(); tmp.add(m); } return tmp; }catch(JMSException jmsex){ throw new EJBException(jmsex); }finally{ if (qSession != null){ try{ qSession.close(); }catch(JMSException jmsex){ jmsex.printStackTrace(); } } } } public Message remove(String transactionId){ QueueSession qSession = null; QueueReceiver qReceiver = null; Message obj = null; String messageFilter = "JMSCorrelationID='" + transactionId + "'"; try{ qSession = this.m_qeueConn.createQueueSession(true, Session.AUTO_ACKNOWLEDGE); qReceiver = qSession.createReceiver(this.m_queue,messageFilter); obj = (Message)qReceiver.receive(); }catch(JMSException jmsex){ jmsex.printStackTrace(); throw new EJBException(jmsex); }finally{ if (qReceiver != null){ try{ qReceiver.close(); }catch(JMSException jmsex){ jmsex.printStackTrace(); } } if (qSession != null){ try{ qSession.close(); }catch(JMSException jmsex){ jmsex.printStackTrace(); } } } return obj; } private class DumpMessageListener implements MessageListener{ public void onMessage(Message m){ System.out.println("Message Received: " + m); } } }