package org.jboss.seam.jms; import static org.jboss.seam.annotations.Install.BUILT_IN; import javax.jms.JMSException; import javax.jms.QueueConnectionFactory; import javax.naming.NamingException; import org.jboss.seam.Component; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Create; import org.jboss.seam.annotations.Destroy; import org.jboss.seam.annotations.Install; import org.jboss.seam.annotations.Logger; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.Unwrap; import org.jboss.seam.annotations.intercept.BypassInterceptors; import org.jboss.seam.core.Expressions.ValueExpression; import org.jboss.seam.log.Log; import org.jboss.seam.util.Naming; /** * Manager for a JMS QueueConnection. By default, the JBoss MQ UIL2. * * @author Gavin King * */ @Scope(ScopeType.APPLICATION) @BypassInterceptors @Name("org.jboss.seam.jms.queueConnection") @Install(false) public class QueueConnection { @Logger private Log log; private String queueConnectionFactoryJndiName = "UIL2ConnectionFactory"; private javax.jms.QueueConnection queueConnection; private ValueExpression<QueueConnectionFactory> springQueueConnectionFactory; public ValueExpression<QueueConnectionFactory> getSpringQueueConnectionFactory() { return springQueueConnectionFactory; } public void setSpringQueueConnectionFactory(ValueExpression<QueueConnectionFactory> springQueueConnectionFactory) { this.springQueueConnectionFactory = springQueueConnectionFactory; } /** * The JNDI name of the QueueConnectionFactory */ public String getQueueConnectionFactoryJndiName() { return queueConnectionFactoryJndiName; } public void setQueueConnectionFactoryJndiName(String jndiName) { this.queueConnectionFactoryJndiName = jndiName; } @Create public void init() throws NamingException, JMSException { queueConnection = getQueueConnectionFactory().createQueueConnection(); queueConnection.start(); } @Destroy public void destroy() throws JMSException { try { queueConnection.stop(); } catch (javax.jms.IllegalStateException e) { // as for JEE v5 specs, section EE 6.6 // At least WebSphere v7 enforce this log.warn("queueSession.stop() called during @Destroy in an invalid context for this container. Msg={0}", e.getMessage()); } queueConnection.close(); } private QueueConnectionFactory getQueueConnectionFactory() throws NamingException { if(springQueueConnectionFactory!=null) return springQueueConnectionFactory.getValue(); else return (QueueConnectionFactory) Naming.getInitialContext().lookup(queueConnectionFactoryJndiName); } @Unwrap public javax.jms.QueueConnection getQueueConnection() { return queueConnection; } public static javax.jms.QueueConnection instance() { return (javax.jms.QueueConnection) Component.getInstance(QueueConnection.class); } @Override public String toString() { return "QueueConnection(" + springQueueConnectionFactory!=null?springQueueConnectionFactory.getExpressionString():queueConnectionFactoryJndiName + ")"; } }