User: mnf999 Date: 01/12/18 21:58:00 Modified: src/main/org/jboss/ejb/plugins/jms JMSContainerInvoker.java Log: Revision Changes Path 1.36 +434 -426 jboss/src/main/org/jboss/ejb/plugins/jms/JMSContainerInvoker.java Index: JMSContainerInvoker.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jms/JMSContainerInvoker.java,v retrieving revision 1.35 retrieving revision 1.36 diff -u -r1.35 -r1.36 --- JMSContainerInvoker.java 2001/12/13 13:25:32 1.35 +++ JMSContainerInvoker.java 2001/12/19 05:58:00 1.36 @@ -1,15 +1,16 @@ /* - * JBoss, the OpenSource J2EE webOS - * - * Distributable under LGPL license. - * See terms of license at gnu.org. - */ +* JBoss, the OpenSource J2EE webOS +* +* Distributable under LGPL license. +* See terms of license at gnu.org. +*/ package org.jboss.ejb.plugins.jms; import java.lang.reflect.Method; import java.security.Principal; import java.util.Collection; import java.util.Hashtable; + import javax.ejb.EJBHome; import javax.ejb.EJBMetaData; import javax.ejb.EJBObject; @@ -30,7 +31,10 @@ import org.jboss.deployment.DeploymentException; import org.jboss.ejb.Container; import org.jboss.ejb.ContainerInvoker; -import org.jboss.ejb.MethodInvocation; + +import org.jboss.deployment.DeploymentException; +import org.jboss.invocation.Invocation; + import org.jboss.logging.Logger; import org.jboss.jms.ConnectionFactoryHelper; import org.jboss.jms.asf.ServerSessionPoolFactory; @@ -43,244 +47,247 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; /** - * ContainerInvoker for JMS MessageDrivenBeans, based on JRMPContainerInvoker. - * - * @author <a href="mailto:[EMAIL PROTECTED]">Peter Antman</a> . - * @author <a href="mailto:[EMAIL PROTECTED]">Rickard �berg</a> - * @author <a href="mailto:[EMAIL PROTECTED]">Sebastien Alborini - * </a> - * @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a> - * @author <a href="mailto:[EMAIL PROTECTED]">Jason Dillon</a> - * @version $Revision: 1.35 $ - */ +* ContainerInvoker for JMS MessageDrivenBeans, based on JRMPContainerInvoker. +* +* @author <a href="mailto:[EMAIL PROTECTED]">Peter Antman</a> . +* @author <a href="mailto:[EMAIL PROTECTED]">Rickard �berg</a> +* @author <a href="mailto:[EMAIL PROTECTED]">Sebastien Alborini </a> +* @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a> +* @author <a href="mailto:[EMAIL PROTECTED]">Jason Dillon</a> +* @version $Revision: 1.36 $ +* <p><b>20011219 marc fleury</b> +* <ul> +* <li> use of the container invoker here is silly and a good example of why the proxy generation is not mixed with invokers now +*</ul> +*/ public class JMSContainerInvoker - implements ContainerInvoker, XmlLoadable +implements ContainerInvoker, XmlLoadable { // Constants ----------------------------------------------------- - + /** - * {@link MessageListener#onMessage} reference. - */ + * {@link MessageListener#onMessage} reference. + */ /* - * final - */ + * final + */ protected static Method ON_MESSAGE; - + /** - * Default destination type. Used when no message-driven-destination is given - * in ejb-jar, and a lookup of destinationJNDI from jboss.xml is not - * successfull. Default value: javax.jms.Topic. - */ + * Default destination type. Used when no message-driven-destination is given + * in ejb-jar, and a lookup of destinationJNDI from jboss.xml is not + * successfull. Default value: javax.jms.Topic. + */ protected final static String DEFAULT_DESTINATION_TYPE = "javax.jms.Topic"; - + // Attributes ---------------------------------------------------- - + /** - * Description of the Field - */ + * Description of the Field + */ protected boolean optimize; // = false; /** - * Maximu number provider is allowed to stuff into a session. - */ + * Maximu number provider is allowed to stuff into a session. + */ protected int maxMessagesNr = 1; /** - * Maximun pool size of server sessions. - */ + * Maximun pool size of server sessions. + */ protected int maxPoolSize = 15; /** - * Time to wait before retrying to reconnect a lost connection. - */ + * Time to wait before retrying to reconnect a lost connection. + */ protected long reconnectInterval = 10000; /** - * If Dead letter queue should be used or not. - */ + * If Dead letter queue should be used or not. + */ protected boolean useDLQ = false; /** - * JNDI name of the provider adapter. - * @see org.jboss.jms.jndi.JMSProviderAdapter - */ + * JNDI name of the provider adapter. + * @see org.jboss.jms.jndi.JMSProviderAdapter + */ protected String providerAdapterJNDI; /** - * JNDI name of the server session factory. - * @see org.jboss.jms.asf.ServerSessionPoolFactory - */ + * JNDI name of the server session factory. + * @see org.jboss.jms.asf.ServerSessionPoolFactory + */ protected String serverSessionPoolFactoryJNDI; /** - * JMS acknowledge mode, used when session is not XA. - */ + * JMS acknowledge mode, used when session is not XA. + */ protected int acknowledgeMode; /** - * escription of the Field - */ + * escription of the Field + */ protected boolean isContainerManagedTx; /** - * Description of the Field - */ + * Description of the Field + */ protected boolean isNotSupportedTx; /** - * The container. - */ + * The container. + */ protected Container container; /** - * The JMS connection. - */ + * The JMS connection. + */ protected Connection connection; /** - * TH JMS connection consumer. - */ + * TH JMS connection consumer. + */ protected ConnectionConsumer connectionConsumer; /** - * Description of the Field - */ + * Description of the Field + */ protected TransactionManager tm; /** - * Description of the Field - */ + * Description of the Field + */ protected ServerSessionPool pool; /** - * Description of the Field - */ + * Description of the Field + */ protected ExceptionListenerImpl exListener; /** - * Description of the Field - */ + * Description of the Field + */ protected String beanName; /** - * Dead letter queue handler. - */ + * Dead letter queue handler. + */ protected DLQHandler dlqHandler; /** - * DLQConfig element from MDBConfig element from jboss.xml. - */ + * DLQConfig element from MDBConfig element from jboss.xml. + */ protected Element dlqConfig; - + /** - * Instance logger. - */ + * Instance logger. + */ private final Logger log = Logger.getLogger(this.getClass()); - + // ContainerService implementation ------------------------------- - + /** - * Set the container for which this is an invoker to. - * - * @param container The container for which this is an invoker to. - */ + * Set the container for which this is an invoker to. + * + * @param container The container for which this is an invoker to. + */ public void setContainer(final Container container) { this.container = container; //jndiName = container.getBeanMetaData().getJndiName(); } - + // Static -------------------------------------------------------- - + // Constructors -------------------------------------------------- - + // Public -------------------------------------------------------- - + /** - * Sets the Optimized attribute of the JMSContainerInvoker object - * - * @param optimize The new Optimized value - */ + * Sets the Optimized attribute of the JMSContainerInvoker object + * + * @param optimize The new Optimized value + */ public void setOptimized(final boolean optimize) { log.debug("Container Invoker optimize set to " + optimize); this.optimize = optimize; } - + // ContainerInvoker implementation - + /** - * Gets the EJBHome attribute of the JMSContainerInvoker object - * - * @return The EJBHome value - */ - public EJBHome getEJBHome() + * Gets the EJBHome attribute of the JMSContainerInvoker object + * + * @return The EJBHome value + */ + public Object getEJBHome() { throw new Error("Not valid for MessageDriven beans"); } - + /** - * Gets the EJBMetaData attribute of the JMSContainerInvoker object - * - * @return The EJBMetaData value - */ + * Gets the EJBMetaData attribute of the JMSContainerInvoker object + * + * @return The EJBMetaData value + */ public EJBMetaData getEJBMetaData() { throw new Error("Not valid for MessageDriven beans"); } - + /** - * Gets the EntityCollection attribute of the JMSContainerInvoker object - * - * @param ids Description of Parameter - * @return The EntityCollection value - */ + * Gets the EntityCollection attribute of the JMSContainerInvoker object + * + * @param ids Description of Parameter + * @return The EntityCollection value + */ public Collection getEntityCollection(Collection ids) { throw new Error("Not valid for MessageDriven beans"); } - + /** - * Gets the EntityEJBObject attribute of the JMSContainerInvoker object - * - * @param id Description of Parameter - * @return The EntityEJBObject value - */ - public EJBObject getEntityEJBObject(Object id) + * Gets the EntityEJBObject attribute of the JMSContainerInvoker object + * + * @param id Description of Parameter + * @return The EntityEJBObject value + */ + public Object getEntityEJBObject(Object id) { throw new Error("Not valid for MessageDriven beans"); } - + /** - * Gets the StatefulSessionEJBObject attribute of the JMSContainerInvoker - * object - * - * @param id Description of Parameter - * @return The StatefulSessionEJBObject value - */ - public EJBObject getStatefulSessionEJBObject(Object id) + * Gets the StatefulSessionEJBObject attribute of the JMSContainerInvoker + * object + * + * @param id Description of Parameter + * @return The StatefulSessionEJBObject value + */ + public Object getStatefulSessionEJBObject(Object id) { throw new Error("Not valid for MessageDriven beans"); } - + /** - * Gets the StatelessSessionEJBObject attribute of the JMSContainerInvoker - * object - * - * @return The StatelessSessionEJBObject value - */ - public EJBObject getStatelessSessionEJBObject() + * Gets the StatelessSessionEJBObject attribute of the JMSContainerInvoker + * object + * + * @return The StatelessSessionEJBObject value + */ + public Object getStatelessSessionEJBObject() { throw new Error("Not valid for MessageDriven beans"); } - + /** - * Gets the Optimized attribute of the JMSContainerInvoker object - * - * @return The Optimized value - */ + * Gets the Optimized attribute of the JMSContainerInvoker object + * + * @return The Optimized value + */ public boolean isOptimized() { log.debug("Optimize in action: " + optimize); return optimize; } - + /** - * Take down all fixtures. - */ + * Take down all fixtures. + */ public void destroy() { log.debug("Destroying JMSContainerInvoker for bean " + beanName); - + // Take down DLQ if ( dlqHandler != null) { - dlqHandler.destroy(); + dlqHandler.destroy(); } - + // close the connection consumer try { @@ -293,7 +300,7 @@ { log.error("Could not close consumer", e); } - + // clear the server session pool (if it is clearable) try { @@ -307,7 +314,7 @@ { log.error("Could not clear ServerSessionPool", e); } - + // close the connection if (connection != null) { @@ -321,43 +328,43 @@ } } } - + /** - * XmlLoadable implementation. - * - * FIXME - we ought to move all config into MDBConfig, but I do not - * do that now due to backward compatibility. - * - * @param element Description of Parameter - * @exception DeploymentException Description of Exception - */ + * XmlLoadable implementation. + * + * FIXME - we ought to move all config into MDBConfig, but I do not + * do that now due to backward compatibility. + * + * @param element Description of Parameter + * @exception DeploymentException Description of Exception + */ public void importXml(Element element) throws DeploymentException { try { String maxMessages = MetaData.getElementContent - (MetaData.getUniqueChild(element, "MaxMessages")); + (MetaData.getUniqueChild(element, "MaxMessages")); maxMessagesNr = Integer.parseInt(maxMessages); - + String maxSize = MetaData.getElementContent - (MetaData.getUniqueChild(element, "MaximumSize")); + (MetaData.getUniqueChild(element, "MaximumSize")); maxPoolSize = Integer.parseInt(maxSize); - - Element mdbConfig = MetaData.getUniqueChild(element, "MDBConfig"); - - String reconnect = MetaData.getElementContent - (MetaData.getUniqueChild(mdbConfig, "ReconnectIntervalSec")); - reconnectInterval = Long.parseLong(reconnect)*1000; - - // Get Dead letter queue config - and save it for later use - Element dlqEl = MetaData.getOptionalChild(mdbConfig, "DLQConfig"); - if (dlqEl != null) { - dlqConfig = (Element)((Node)dlqEl).cloneNode(true); - useDLQ = true; - } else { - useDLQ = false; - } - + + Element mdbConfig = MetaData.getUniqueChild(element, "MDBConfig"); + + String reconnect = MetaData.getElementContent + (MetaData.getUniqueChild(mdbConfig, "ReconnectIntervalSec")); + reconnectInterval = Long.parseLong(reconnect)*1000; + + // Get Dead letter queue config - and save it for later use + Element dlqEl = MetaData.getOptionalChild(mdbConfig, "DLQConfig"); + if (dlqEl != null) { + dlqConfig = (Element)((Node)dlqEl).cloneNode(true); + useDLQ = true; + } else { + useDLQ = false; + } + } catch (NumberFormatException e) { @@ -367,94 +374,95 @@ { //Noop will take default value } - + // If these are not found we will get a DeploymentException, I hope providerAdapterJNDI = MetaData.getElementContent - (MetaData.getUniqueChild(element, "JMSProviderAdapterJNDI")); - + (MetaData.getUniqueChild(element, "JMSProviderAdapterJNDI")); + serverSessionPoolFactoryJNDI = MetaData.getElementContent - (MetaData.getUniqueChild(element, "ServerSessionPoolFactoryJNDI")); - + (MetaData.getUniqueChild(element, "ServerSessionPoolFactoryJNDI")); + // Check java:/ prefix if (!providerAdapterJNDI.startsWith("java:/")) { providerAdapterJNDI = "java:/" + providerAdapterJNDI; } - + if (!serverSessionPoolFactoryJNDI.startsWith("java:/")) { serverSessionPoolFactoryJNDI = "java:/" + serverSessionPoolFactoryJNDI; } - - - - } - - /** - * Initialize the container invoker. Sets up a connection, a server session - * pool and a connection consumer for the configured destination. - * - * @throws Exception Failed to initalize. - */ - public void init() throws Exception + + + + } + + /** + * Initialize the container invoker. Sets up a connection, a server session + * pool and a connection consumer for the configured destination. + * + * @throws Exception Failed to initalize. + */ + public void create() throws Exception { log.debug("initializing"); - + // Set up Dead Letter Queue handler + if (useDLQ) { - dlqHandler = new DLQHandler(); - dlqHandler.importXml(dlqConfig); - dlqHandler.init(); + dlqHandler = new DLQHandler(); + dlqHandler.importXml(mdbConfig); + dlqHandler.create(); } - + // Store TM reference locally - should we test for CMT Required tm = container.getTransactionManager(); - + // Get configuration information - from EJB-xml MessageDrivenMetaData config = - ((MessageDrivenMetaData)container.getBeanMetaData()); - + ((MessageDrivenMetaData)container.getBeanMetaData()); + // Selector String messageSelector = config.getMessageSelector(); - + // Queue or Topic - optional unfortunately String destinationType = config.getDestinationType(); - + // Bean Name beanName = config.getEjbName(); - + // Is container managed? isContainerManagedTx = config.isContainerManagedTx(); acknowledgeMode = config.getAcknowledgeMode(); isNotSupportedTx = - config.getMethodTransactionType("onMessage", + config.getMethodTransactionType("onMessage", new Class[]{Message.class}, false) == MetaData.TX_NOT_SUPPORTED; - + // Get configuration data from jboss.xml String destinationJNDI = config.getDestinationJndiName(); String user = config.getUser(); String password = config.getPasswd(); - + // Get the JMS provider JMSProviderAdapter adapter = getJMSProviderAdapter(); log.debug("provider adapter: " + adapter); - + // Connect to the JNDI server and get a reference to root context Context context = adapter.getInitialContext(); log.debug("context: " + context); - + // if we can't get the root context then exit with an exception if (context == null) { throw new RuntimeException("Failed to get the root context"); } - + // Get the JNDI suffix of the destination String jndiSuffix = parseJndiSuffix(destinationJNDI, - config.getEjbName()); + config.getEjbName()); log.debug("jndiSuffix: " + jndiSuffix); - + // Unfortunately the destination is optional, so if we do not have one // here we have to look it up if we have a destinationJNDI, else give it // a default. @@ -463,126 +471,126 @@ log.info("No message-driven-destination given, guessing type"); destinationType = getDestinationType(context, destinationJNDI); } - + if (destinationType.equals("javax.jms.Topic")) { log.debug("Got destination type Topic for " + config.getEjbName()); - + // create a topic connection Object factory = context.lookup(adapter.getTopicFactoryRef()); TopicConnection tConnection = - (TopicConnection)ConnectionFactoryHelper.createTopicConnection - (factory, user, password); + (TopicConnection)ConnectionFactoryHelper.createTopicConnection + (factory, user, password); connection = tConnection; - + // lookup or create the destination topic Topic topic = - (Topic)createDestination(Topic.class, - context, - "topic/" + jndiSuffix, - jndiSuffix); - + (Topic)createDestination(Topic.class, + context, + "topic/" + jndiSuffix, + jndiSuffix); + // set up the server session pool pool = createSessionPool(tConnection, - maxPoolSize, - true, // tx - acknowledgeMode , - new MessageListenerImpl(this)); - + maxPoolSize, + true, // tx + acknowledgeMode , + new MessageListenerImpl(this)); + // To be no-durable or durable if (config.getSubscriptionDurability() != - MessageDrivenMetaData.DURABLE_SUBSCRIPTION) + MessageDrivenMetaData.DURABLE_SUBSCRIPTION) { // Create non durable connectionConsumer = - tConnection.createConnectionConsumer(topic, - messageSelector, - pool, - maxMessagesNr); + tConnection.createConnectionConsumer(topic, + messageSelector, + pool, + maxMessagesNr); } else { //Durable subscription String clientId = config.getClientId(); String durableName = - clientId != null ? clientId : config.getEjbName(); - + clientId != null ? clientId : config.getEjbName(); + connectionConsumer = - tConnection.createDurableConnectionConsumer(topic, - durableName, - messageSelector, - pool, - maxMessagesNr); + tConnection.createDurableConnectionConsumer(topic, + durableName, + messageSelector, + pool, + maxMessagesNr); } - + log.debug("Topic connectionConsumer set up"); } else if (destinationType.equals("javax.jms.Queue")) { log.debug("Got destination type Queue for " + config.getEjbName()); - + // create a queue connection Object qFactory = context.lookup(adapter.getQueueFactoryRef()); QueueConnection qConnection = - (QueueConnection)ConnectionFactoryHelper.createQueueConnection - (qFactory, user, password); + (QueueConnection)ConnectionFactoryHelper.createQueueConnection + (qFactory, user, password); connection = qConnection; - + // lookup or create the destination queue Queue queue = - (Queue)createDestination(Queue.class, - context, - "queue/" + jndiSuffix, - jndiSuffix); - + (Queue)createDestination(Queue.class, + context, + "queue/" + jndiSuffix, + jndiSuffix); + // set up the server session pool pool = createSessionPool(qConnection, - maxPoolSize, - true, - // tx - acknowledgeMode, - new MessageListenerImpl(this)); + maxPoolSize, + true, + // tx + acknowledgeMode, + new MessageListenerImpl(this)); log.debug("server session pool: " + pool); - + // create the connection consumer connectionConsumer = - qConnection.createConnectionConsumer(queue, - messageSelector, - pool, - maxMessagesNr); + qConnection.createConnectionConsumer(queue, + messageSelector, + pool, + maxMessagesNr); log.debug("connection consumer: " + connectionConsumer); } - + log.debug("initialized with config " + toString()); } - + /** - * #Description of the Method - * - * @param id Description of Parameter - * @param m Description of Parameter - * @param args Description of Parameter - * @param tx Description of Parameter - * @param identity Description of Parameter - * @param credential Description of Parameter - * @return Description of the Returned Value - * @exception Exception Description of Exception - */ + * #Description of the Method + * + * @param id Description of Parameter + * @param m Description of Parameter + * @param args Description of Parameter + * @param tx Description of Parameter + * @param identity Description of Parameter + * @param credential Description of Parameter + * @return Description of the Returned Value + * @exception Exception Description of Exception + */ public Object invoke(Object id, - Method m, - Object[] args, - Transaction tx, - Principal identity, - Object credential) - throws Exception + Method m, + Object[] args, + Transaction tx, + Principal identity, + Object credential) + throws Exception { - MethodInvocation mi = - new MethodInvocation(id, m, args, tx, identity, credential); - + Invocation mi = + new Invocation(id, m, args, tx, identity, credential); + // Set the right context classloader ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(container.getClassLoader()); - + try { return container.invoke(mi); @@ -592,12 +600,12 @@ Thread.currentThread().setContextClassLoader(oldCl); } } - + /** - * Start the connection. - * - * @exception Exception Description of Exception - */ + * Start the connection. + * + * @exception Exception Description of Exception + */ public void start() throws Exception { log.debug("Starting JMSContainerInvoker for bean " + beanName); @@ -605,10 +613,10 @@ connection.setExceptionListener(exListener); connection.start(); } - + /** - * Stop the connection. - */ + * Stop the connection. + */ public void stop() { log.debug("Stopping JMSContainerInvoker for bean " + beanName); @@ -619,21 +627,21 @@ } innerStop(); } - + /** - * Try to get a destination type by looking up the destination JNDI, or - * provide a default if there is not destinationJNDI or if it is not possible - * to lookup. - * - * @param ctx The naming context to lookup destinations from. - * @param destinationJNDI The name to use when looking up destinations. - * @return The destination type, either derived from - * destinationJDNI or DEFAULT_DESTINATION_TYPE - */ + * Try to get a destination type by looking up the destination JNDI, or + * provide a default if there is not destinationJNDI or if it is not possible + * to lookup. + * + * @param ctx The naming context to lookup destinations from. + * @param destinationJNDI The name to use when looking up destinations. + * @return The destination type, either derived from + * destinationJDNI or DEFAULT_DESTINATION_TYPE + */ protected String getDestinationType(Context ctx, String destinationJNDI) { String destType = null; - + if (destinationJNDI != null) { try @@ -652,7 +660,7 @@ { log.debug("Could not do heristic lookup of destination " + ex, ex); } - + } if (destType == null) { @@ -661,15 +669,15 @@ } return destType; } - + /** - * Return the JMSProviderAdapter that should be used. - * - * @return The JMSProviderAdapter to use. - * @exception NamingException Description of Exception - */ + * Return the JMSProviderAdapter that should be used. + * + * @return The JMSProviderAdapter to use. + * @exception NamingException Description of Exception + */ protected JMSProviderAdapter getJMSProviderAdapter() - throws NamingException + throws NamingException { Context context = new InitialContext(); try @@ -682,27 +690,27 @@ context.close(); } } - + /** - * Create and or lookup a JMS destination. - * - * @param type Either javax.jms.Queue or - * javax.jms.Topic. - * @param ctx The naming context to lookup - * destinations from. - * @param jndiName The name to use when looking up - * destinations. - * @param jndiSuffix The name to use when creating - * destinations. - * @return The destination. - * @throws IllegalArgumentException Type is not Queue or Topic. - * @exception Exception Description of Exception - */ + * Create and or lookup a JMS destination. + * + * @param type Either javax.jms.Queue or + * javax.jms.Topic. + * @param ctx The naming context to lookup + * destinations from. + * @param jndiName The name to use when looking up + * destinations. + * @param jndiSuffix The name to use when creating + * destinations. + * @return The destination. + * @throws IllegalArgumentException Type is not Queue or Topic. + * @exception Exception Description of Exception + */ protected Destination createDestination(final Class type, - final Context ctx, - final String jndiName, - final String jndiSuffix) - throws Exception + final Context ctx, + final String jndiName, + final String jndiSuffix) + throws Exception { try { @@ -719,8 +727,8 @@ // very, very unportable). // MBeanServer server = (MBeanServer) - MBeanServerFactory.findMBeanServer(null).iterator().next(); - + MBeanServerFactory.findMBeanServer(null).iterator().next(); + String methodName; if (type == Topic.class) { @@ -734,67 +742,67 @@ { // type was not a Topic or Queue, bad user throw new IllegalArgumentException - ("expected javax.jms.Queue or javax.jms.Topic: " + type); + ("expected javax.jms.Queue or javax.jms.Topic: " + type); } - + // invoke the server to create the destination server.invoke(new ObjectName("JBossMQ", "service", "Server"), - methodName, - new Object[]{jndiSuffix}, - new String[]{"java.lang.String"}); - + methodName, + new Object[]{jndiSuffix}, + new String[]{"java.lang.String"}); + // try to look it up again return (Destination)ctx.lookup(jndiName); } } - + /** - * Create a server session pool for the given connection. - * - * @param connection The connection to use. - * @param maxSession The maximum number of sessions. - * @param isTransacted True if the sessions are transacted. - * @param ack The session acknowledgement mode. - * @param listener The message listener. - * @return A server session pool. - * @throws JMSException - * @exception NamingException Description of Exception - */ + * Create a server session pool for the given connection. + * + * @param connection The connection to use. + * @param maxSession The maximum number of sessions. + * @param isTransacted True if the sessions are transacted. + * @param ack The session acknowledgement mode. + * @param listener The message listener. + * @return A server session pool. + * @throws JMSException + * @exception NamingException Description of Exception + */ protected ServerSessionPool - createSessionPool(final Connection connection, - final int maxSession, - final boolean isTransacted, - final int ack, - final MessageListener listener) - throws NamingException, JMSException + createSessionPool(final Connection connection, + final int maxSession, + final boolean isTransacted, + final int ack, + final MessageListener listener) + throws NamingException, JMSException { ServerSessionPool pool; Context context = new InitialContext(); - + try { // first lookup the factory log.debug("looking up session pool factory: " + - serverSessionPoolFactoryJNDI); + serverSessionPoolFactoryJNDI); ServerSessionPoolFactory factory = (ServerSessionPoolFactory) - context.lookup(serverSessionPoolFactoryJNDI); - + context.lookup(serverSessionPoolFactoryJNDI); + // the create the pool pool = factory.getServerSessionPool - (connection, maxSession, isTransacted, ack, !isContainerManagedTx || isNotSupportedTx, listener); + (connection, maxSession, isTransacted, ack, !isContainerManagedTx || isNotSupportedTx, listener); } finally { context.close(); } - + return pool; } - + /** - * Stop done from inside, we should not stop the exceptionListener in inner - * stop. - */ + * Stop done from inside, we should not stop the exceptionListener in inner + * stop. + */ protected void innerStop() { try @@ -809,7 +817,7 @@ { log.error("Could not set ExceptionListener to null", e); } - + // Stop the connection try { @@ -824,16 +832,16 @@ log.error("Could not stop JMS connection", e); } } - + /** - * Parse the JNDI suffix from the given JNDI name. - * - * @param jndiname The JNDI name used to lookup the destination. - * @param defautSuffix Description of Parameter - * @return The parsed suffix or the defaultSuffix - */ + * Parse the JNDI suffix from the given JNDI name. + * + * @param jndiname The JNDI name used to lookup the destination. + * @param defautSuffix Description of Parameter + * @return The parsed suffix or the defaultSuffix + */ protected String parseJndiSuffix(final String jndiname, - final String defautSuffix) + final String defautSuffix) { // jndiSuffix is merely the name that the user has given the MDB. // since the jndi name contains the message type I have to split @@ -856,57 +864,57 @@ // if the jndi name from jboss.xml is null then lets use the ejbName jndiSuffix = defautSuffix; } - + return jndiSuffix; } - + // Package protected --------------------------------------------- - + // Protected ----------------------------------------------------- - + // Private ------------------------------------------------------- - + // Inner classes ------------------------------------------------- - + /** - * An implementation of MessageListener that passes messages on to the - * container invoker. - */ + * An implementation of MessageListener that passes messages on to the + * container invoker. + */ class MessageListenerImpl - implements MessageListener + implements MessageListener { /** - * The container invoker. - */ + * The container invoker. + */ JMSContainerInvoker invoker; // = null; - + /** - * Construct a <tt>MessageListenerImpl</tt> . - * - * @param invoker The container invoker. Must not be null. - */ + * Construct a <tt>MessageListenerImpl</tt> . + * + * @param invoker The container invoker. Must not be null. + */ MessageListenerImpl(final JMSContainerInvoker invoker) { // assert invoker != null; - + this.invoker = invoker; } - + /** - * Process a message. - * - * @param message The message to process. - */ + * Process a message. + * + * @param message The message to process. + */ public void onMessage(final Message message) { // assert message != null; - + if (log.isTraceEnabled()) { log.debug("processing message: " + message); } - + Object id; try { @@ -917,31 +925,31 @@ // what ? id = "JMSContainerInvoker"; } - + // Invoke, shuld we catch any Exceptions?? try { // DLQHandling if (useDLQ && // Is Dead Letter Queue used at all - message.getJMSRedelivered() && // Was message resent - dlqHandler.handleRedeliveredMessage(message)) //Did the DLQ handler take care of the message + message.getJMSRedelivered() && // Was message resent + dlqHandler.handleRedeliveredMessage(message)) //Did the DLQ handler take care of the message { // Message will be placed on Dead Letter Queue, // if redelivered to many times return; } - + invoker.invoke(id, - // Object id - where used? - ON_MESSAGE, - // Method to invoke - new Object[]{message}, - // argument - tm.getTransaction(), - // Transaction - null, - // Principal - null); + // Object id - where used? + ON_MESSAGE, + // Method to invoke + new Object[]{message}, + // argument + tm.getTransaction(), + // Transaction + null, + // Principal + null); // Cred } catch (Exception e) @@ -950,33 +958,33 @@ } } } - + /** - * ExceptionListener for failover handling. - */ + * ExceptionListener for failover handling. + */ class ExceptionListenerImpl - implements ExceptionListener + implements ExceptionListener { JMSContainerInvoker invoker; // = null; Thread currentThread; // = null; boolean notStoped = true; - + ExceptionListenerImpl(final JMSContainerInvoker invoker) { this.invoker = invoker; } - + /** - * #Description of the Method - * - * @param ex Description of Parameter - */ + * #Description of the Method + * + * @param ex Description of Parameter + */ public void onException(JMSException ex) { currentThread = Thread.currentThread(); - + log.warn("MDB lost connection to provider", ex); boolean tryIt = true; while (tryIt && notStoped) @@ -993,11 +1001,11 @@ tryIt = false; return; } - + // Reboot container invoker.innerStop(); invoker.destroy(); - invoker.init(); + invoker.create(); invoker.start(); tryIt = false; log.info("OK - reconnected"); @@ -1009,11 +1017,11 @@ } currentThread = null; } - + void stop() { log.debug("stop requested"); - + notStoped = false; if (currentThread != null) { @@ -1022,10 +1030,10 @@ } } } - + /** - * Return a string representation of the current config state. - */ + * Return a string representation of the current config state. + */ public String toString() { StringBuffer buff = new StringBuffer(); @@ -1041,14 +1049,14 @@ buff.append(";isNotSupportedTx=").append(isNotSupportedTx); buff.append(";useDLQ=").append(useDLQ); if (dlqHandler != null) - buff.append(";dlqHandler=").append(dlqHandler.toString()); + buff.append(";dlqHandler=").append(dlqHandler.toString()); buff.append("}"); return buff.toString(); } - + /** - * Initialize the ON_MESSAGE reference. - */ + * Initialize the ON_MESSAGE reference. + */ static { try
_______________________________________________ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development
