package org.apache.tuscany.binding.jms; import java.util.Properties; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; public class SimpleJMSResourceFactory implements JMSResourceFactory { private JMSBinding jmsBinding; private Connection con; private Context context; private boolean isConnectionStarted; public SimpleJMSResourceFactory(JMSBinding jmsBinding){ this.jmsBinding = jmsBinding; } /* * This is a simple implementation where a connection is created per binding * Ideally the resource factory should be able to leverage the host environment * to provide connection pooling if it can. * * For ex If Tuscany is running inside an AppServer * Then we could leverage the JMS resources it provides * * @see org.apache.tuscany.binding.jms.JMSResourceFactory#getConnection() */ public Connection getConnection() throws NamingException, JMSException{ if (con == null){ createConnection(); } return con; } /* (non-Javadoc) * @see org.apache.tuscany.binding.jms.JMSResourceFactory#createSession() */ public Session createSession() throws JMSException, NamingException{ return getConnection().createSession(false, Session.AUTO_ACKNOWLEDGE); } /* (non-Javadoc) * @see org.apache.tuscany.binding.jms.JMSResourceFactory#startConnection() */ public void startConnection() throws JMSException, NamingException{ if(!isConnectionStarted){ getConnection().start(); isConnectionStarted = true; } } /* (non-Javadoc) * @see org.apache.tuscany.binding.jms.JMSResourceFactory#closeConnection() */ public void closeConnection() throws JMSException, NamingException{ if(con != null){ con.close(); } } /* (non-Javadoc) * @see org.apache.tuscany.binding.jms.JMSResourceFactory#createTextMessage(javax.jms.Session) */ public Message createMessage(Session session) throws JMSException{ javax.jms.Message message = session.createTextMessage(); // default message.setJMSDeliveryMode(jmsBinding.getDeliveryMode()); message.setJMSPriority(jmsBinding.getPriority()); return message; } private void createConnection() throws NamingException, JMSException { if(context == null){ createInitialContext(); } ConnectionFactory conFac = (ConnectionFactory)context.lookup(jmsBinding.getConnectionFactoryName()); con = conFac.createConnection(); } private void createInitialContext() throws NamingException{ Properties props = new Properties(); props.setProperty(Context.INITIAL_CONTEXT_FACTORY,jmsBinding.getInitialContextFactoryName()); props.setProperty(Context.PROVIDER_URL,jmsBinding.getJNDIProviderURL()); context = new InitialContext(props); } }