User: user57
Date: 01/07/09 14:14:28
Modified: src/main/org/jboss/ejb/plugins/jms JMSContainerInvoker.java
Log:
o using Log4j for logging
Revision Changes Path
1.17 +516 -447
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.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- JMSContainerInvoker.java 2001/07/02 11:35:44 1.16
+++ JMSContainerInvoker.java 2001/07/09 21:14:28 1.17
@@ -27,7 +27,14 @@
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
+import javax.management.MBeanServerFactory;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.w3c.dom.Element;
+import org.apache.log4j.Category;
+
import org.jboss.ejb.MethodInvocation;
import org.jboss.ejb.Container;
import org.jboss.ejb.ContainerInvokerContainer;
@@ -35,7 +42,6 @@
import org.jboss.ejb.ContainerInvoker;
import org.jboss.ejb.DeploymentException;
-import org.jboss.logging.Logger;
import org.jboss.metadata.XmlLoadable;
import org.jboss.metadata.MetaData;
import org.jboss.metadata.MessageDrivenMetaData;
@@ -43,518 +49,581 @@
import org.jboss.jms.jndi.JMSProviderAdapter;
import org.jboss.jms.asf.ServerSessionPoolFactory;
-import org.w3c.dom.Element;
+import org.jboss.jms.asf.StdServerSessionPool;
-import javax.management.MBeanServerFactory;
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
-
/**
* ContainerInvoker for JMS MessageDrivenBeans, based on JRMPContainerInvoker.
- * <description>
*
- * @see <related>
- * @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>
- * @version $Revision: 1.16 $
+ * @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.17 $
*/
-public class JMSContainerInvoker implements
-ContainerInvoker, XmlLoadable
+public class JMSContainerInvoker
+ implements ContainerInvoker, XmlLoadable
{
- // Constants -----------------------------------------------------
- static final String msgInterface = "javax.jms.MessageListener";
- static final String msgMethod = "onMessage";
- static final String msgArgument = "javax.jms.Message";
- static Method listenerMethod;
- static {
- // Get the method
- try {
- Class msgInterfaceClass = Class.forName(msgInterface);
- Class argumentClass = Class.forName(msgArgument);
- listenerMethod = msgInterfaceClass.getMethod(msgMethod, new Class[]
{argumentClass});
-
- } catch(ClassNotFoundException ex) {
- Logger.error("Could not the classes for message interface" + msgInterface
+ ": " + ex);
- }catch(NoSuchMethodException ex) {
- Logger.error("Could not get the method for message interface" + msgMethod
+ ": " + ex);
- }
- };
+ // Constants -----------------------------------------------------
- // Attributes ----------------------------------------------------
- protected boolean optimize = false;
- protected int maxMessagesNr = 1;
- protected int maxPoolSize = 15;
- protected String jMSProviderAdapterJNDI;
- protected String serverSessionPoolFactoryJNDI;
- protected int acknowledgeMode;
-
- protected Container container;
-
- protected Connection connection;
- protected ConnectionConsumer connectionConsumer;
- protected TransactionManager tm;
- protected ServerSessionPool pool;
- protected ExceptionListenerImpl exListener;
+ /** {@link MessageListener#onMessage} reference. */
+ protected static /* final */ Method ON_MESSAGE;
+ /**
+ * Initialize the ON_MESSAGE reference.
+ */
+ static {
+ try {
+ final Class type = MessageListener.class;
+ final Class arg = Message.class;
+ ON_MESSAGE = type.getMethod("onMessage", new Class[] { arg });
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ throw new ExceptionInInitializerError(e);
+ }
+ }
+ /** Instance logger. */
+ private final Category log = Category.getInstance(this.getClass());
+
+ // Attributes ----------------------------------------------------
+
+ protected boolean optimize; // = false;
+ protected int maxMessagesNr = 1;
+ protected int maxPoolSize = 15;
+ protected String providerAdapterJNDI;
+ protected String serverSessionPoolFactoryJNDI;
+ protected int acknowledgeMode;
+ protected Container container;
+ protected Connection connection;
+ protected ConnectionConsumer connectionConsumer;
+ protected TransactionManager tm;
+ protected ServerSessionPool pool;
+ protected ExceptionListenerImpl exListener;
+
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
// Public --------------------------------------------------------
+
public void setOptimized(boolean optimize)
{
+ log.debug("Container Invoker optimize set to " + optimize);
this.optimize = optimize;
- //DEBUG Logger.debug("Container Invoker optimize set to
'"+optimize+"'");
}
public boolean isOptimized()
{
- //DEBUG Logger.debug("Optimize in action: '"+optimize+"'");
+ log.debug("Optimize in action: " + optimize);
return optimize;
}
public EJBMetaData getEJBMetaData()
{
- throw new Error("Not valid for MessageDriven beans");
+ throw new Error("Not valid for MessageDriven beans");
}
- // ContainerInvoker implementation
- public EJBHome getEJBHome() {throw new Error("Not valid for MessageDriven
beans");}
+ // ContainerInvoker implementation
+
+ public EJBHome getEJBHome() {
+ throw new Error("Not valid for MessageDriven beans");
+ }
- public EJBObject getStatelessSessionEJBObject() {throw new Error("Not valid for
MessageDriven beans");}
+ public EJBObject getStatelessSessionEJBObject() {
+ throw new Error("Not valid for MessageDriven beans");
+ }
- public EJBObject getStatefulSessionEJBObject(Object id) {throw new Error("Not
valid for MessageDriven beans");}
+ public EJBObject getStatefulSessionEJBObject(Object id) {
+ throw new Error("Not valid for MessageDriven beans");
+ }
- public EJBObject getEntityEJBObject(Object id) {throw new Error("Not valid for
MessageDriven beans");}
+ public EJBObject getEntityEJBObject(Object id) {
+ throw new Error("Not valid for MessageDriven beans");
+ }
- public Collection getEntityCollection(Collection ids) {throw new Error("Not
valid for MessageDriven beans");}
+ public Collection getEntityCollection(Collection ids) {
+ throw new Error("Not valid for MessageDriven beans");
+ }
-
- public Object invoke(Object id, Method m, Object[] args, Transaction tx,
- Principal identity, Object credential )
+ public Object invoke(Object id,
+ Method m,
+ Object[] args,
+ Transaction tx,
+ Principal identity,
+ Object credential)
throws Exception
{
-
- MethodInvocation mi = new MethodInvocation(id, m, args, tx, identity,
credential);
+ MethodInvocation mi =
+ new MethodInvocation(id, m, args, tx, identity, credential);
- // Set the right context classloader
- ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(container.getClassLoader());
+ // Set the right context classloader
+ ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(container.getClassLoader());
-
- try
- {
- return container.invoke(mi);
- } finally {
- Thread.currentThread().setContextClassLoader(oldCl);
- }
+ try {
+ return container.invoke(mi);
+ }
+ finally {
+ Thread.currentThread().setContextClassLoader(oldCl);
+ }
}
// ContainerService implementation -------------------------------
- public void setContainer(Container con)
+
+ public void setContainer(final Container container)
{
- this.container = con;
+ this.container = container;
//jndiName = container.getBeanMetaData().getJndiName();
}
- public void init()
- throws Exception
+ /**
+ * Return the JMSProviderAdapter that should be used.
+ */
+ protected JMSProviderAdapter getJMSProviderAdapter()
+ throws NamingException
{
-
- // Store TM reference locally - should we test for CMT Required
- tm = container.getTransactionManager();
+ Context context = new InitialContext();
+ try {
+ log.debug("looking up provider adapter: " + providerAdapterJNDI);
+ return (JMSProviderAdapter)context.lookup(providerAdapterJNDI);
+ }
+ finally {
+ context.close();
+ }
+ }
- /*
- * Get configuration information - from EJB-xml
- */
- MessageDrivenMetaData config =
((MessageDrivenMetaData)container.getBeanMetaData());
-
- // Selector
- String messageSelector = config.getMessageSelector();
- // Queue or Topic
- String destinationType = config.getDestinationType();
-
- // Is containermanages TX
- boolean isContainerManagedTx = config.isContainerManagedTx();
-
- acknowledgeMode = config.getAcknowledgeMode();
-
- // Get configuration data from jboss.xml
- String destinationJNDI = config.getDestinationJndiName();
- String user = config.getUser();
-
+ /**
+ * Return the ServerSessionPoolFactory that should be used.
+ */
+ protected ServerSessionPoolFactory getServerSessionPoolFactory()
+ throws NamingException
+ {
+ Context context = new InitialContext();
+ try {
+ log.debug("looking up session pool factory: " +
+ serverSessionPoolFactoryJNDI);
+ return (ServerSessionPoolFactory)
+ context.lookup(serverSessionPoolFactoryJNDI);
+ }
+ finally {
+ context.close();
+ }
+ }
- /*
- * Set upp JNDI
- * connect to the JNDI server and get a reference to
- * root context
- */
- Context context = null;
-
- Context jbossContext = new InitialContext();
- JMSProviderAdapter adapter =
(JMSProviderAdapter)jbossContext.lookup(jMSProviderAdapterJNDI);
- context = adapter.getInitialContext();
-
+ public void init() throws Exception
+ {
+ log.debug("initializing");
+
+ // Store TM reference locally - should we test for CMT Required
+ tm = container.getTransactionManager();
+
+ // Get configuration information - from EJB-xml
+ MessageDrivenMetaData config =
+ ((MessageDrivenMetaData)container.getBeanMetaData());
- // 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");
- }
+ // Selector
+ String messageSelector = config.getMessageSelector();
+
+ // Queue or Topic
+ String destinationType = config.getDestinationType();
+
+ // Is containermanages TX
+ boolean isContainerManagedTx = config.isContainerManagedTx();
+
+ acknowledgeMode = config.getAcknowledgeMode();
+
+ // Get configuration data from jboss.xml
+ String destinationJNDI = config.getDestinationJndiName();
+ String user = config.getUser();
+
+ // Set upp JNDI
+ // connect to the JNDI server and get a reference to root context
+ Context context = null;
+
+ JMSProviderAdapter adapter = getJMSProviderAdapter();
+ log.debug("provider adapter: " + adapter);
+
+ 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");
+ }
- // Set up pool
- ServerSessionPoolFactory poolFactory =
(ServerSessionPoolFactory)jbossContext.lookup(serverSessionPoolFactoryJNDI);
+ // Set up pool
+ ServerSessionPoolFactory poolFactory = getServerSessionPoolFactory();
- // jndiSuffix is merely the name that the user has given the MDB.
- // since the jndi name contains the message type I have to split at the "/"
- // if there is no slash then I use the entire jndi name.....
- String jndiSuffix = "";
- if(destinationJNDI != null){
- int indexOfSlash = destinationJNDI.indexOf("/");
- if(indexOfSlash != -1){
- jndiSuffix = destinationJNDI.substring(indexOfSlash+1);
- }else{
- jndiSuffix = destinationJNDI;
- }
-
- // if the jndi name from jboss.xml is null then lets use the ejbName
- }else{
- jndiSuffix = config.getEjbName();
- }
- MBeanServer server =
(MBeanServer)MBeanServerFactory.findMBeanServer(null).iterator().next();
+ // jndiSuffix is merely the name that the user has given the MDB.
+ // since the jndi name contains the message type I have to split
+ // at the "/" if there is no slash then I use the entire jndi name...
+ String jndiSuffix = "";
+ if (destinationJNDI != null) {
+ int indexOfSlash = destinationJNDI.indexOf("/");
+ if (indexOfSlash != -1) {
+ jndiSuffix = destinationJNDI.substring(indexOfSlash+1);
+ } else {
+ jndiSuffix = destinationJNDI;
+ }
+ // if the jndi name from jboss.xml is null then lets use the ejbName
+ } else {
+ jndiSuffix = config.getEjbName();
+ }
+ log.debug("jndiSuffix: " + jndiSuffix);
+
+ MBeanServer server = (MBeanServer)
+ MBeanServerFactory.findMBeanServer(null).iterator().next();
- if (destinationType.equals("javax.jms.Topic"))
- {
- Logger.debug("Got destination type Topic for " + config.getEjbName());
+ if (destinationType.equals("javax.jms.Topic"))
+ {
+ log.debug("Got destination type Topic for " + config.getEjbName());
- // All classes are different between topics and queues!!
- TopicConnectionFactory topicFactory =
- (TopicConnectionFactory)context.
- lookup(adapter.getTopicFactoryRef());
- // Do we have a user - this is messy code (should be done for queues to)
- TopicConnection topicConnection;
- if(user != null)
- {
- Logger.debug("Creating topic connection with user: " +
- user + " passwd: " + config.getPasswd());
- topicConnection = topicFactory.
- createTopicConnection(user, config.getPasswd());
- }
- else
- {
- topicConnection = topicFactory.createTopicConnection();
- }
+ // All classes are different between topics and queues!!
+ TopicConnectionFactory topicFactory =
+ (TopicConnectionFactory)context.
+ lookup(adapter.getTopicFactoryRef());
+
+ // Do we have a user - this is messy code (should be done for queues to)
+ TopicConnection topicConnection;
+ if(user != null)
+ {
+ log.debug("Creating topic connection with user: " +
+ user + " passwd: " + config.getPasswd());
+ topicConnection = topicFactory.
+ createTopicConnection(user, config.getPasswd());
+ }
+ else
+ {
+ topicConnection = topicFactory.createTopicConnection();
+ }
- // Lookup destination
- // First Try a lookup.
- // If that lookup fails then try to contact the MBeanServer and inoke a
new...
- // Then do lookup again..
- String topicJndi = "topic/"+jndiSuffix;
- Topic topic;
- try{
- topic = (Topic)context.lookup(topicJndi);
- }catch(NamingException ne){
- Logger.log("JndiName not found:"+topicJndi + "...attempting
to recover");
- server.invoke(new ObjectName("JMS","service","JMSServer"),
"newTopic", new Object[]{jndiSuffix}, new String[] {"java.lang.String"});
- topic = (Topic)context.lookup(topicJndi);
- }
+ // Lookup destination
+ // First Try a lookup.
+ // If that lookup fails then try to contact the MBeanServer and inoke a
new...
+ // Then do lookup again..
+ String topicJndi = "topic/"+jndiSuffix;
+ Topic topic;
+ try {
+ topic = (Topic)context.lookup(topicJndi);
+ } catch(NamingException ne) {
+ log.error("JndiName not found:"+topicJndi +
+ "...attempting to recover", ne);
+ server.invoke(new ObjectName("JMS","service","JMSServer"),
+ "newTopic", new Object[]{jndiSuffix},
+ new String[] {"java.lang.String"});
+ topic = (Topic)context.lookup(topicJndi);
+ }
+
+ pool = poolFactory.getServerSessionPool
+ (topicConnection,
+ maxPoolSize,
+ //Transacted
+ true,
+ acknowledgeMode,
+ new MessageListenerImpl(this));
+
+ // To be no-durable or durable
+ if (config.getSubscriptionDurability() !=
+ MessageDrivenMetaData.DURABLE_SUBSCRIPTION)
+ {
+ // Create non durable
+ connectionConsumer = topicConnection.
+ createConnectionConsumer(topic,
+ messageSelector,
+ pool,
+ maxMessagesNr);
+ }
+ else
+ {
+ //Durable subscription
+ String clientId = config.getClientId();
+ String durableName = clientId != null ? clientId:
+
+ config.getEjbName();
+ connectionConsumer = topicConnection.
+ createDurableConnectionConsumer(topic,
+ durableName,
+ messageSelector,
+ pool,
+ maxMessagesNr);
+ }
+
+ // set global connection, so we have something to
+ // start() and close()
+ connection = topicConnection;
+ log.debug("Topic connectionConsumer set up");
+
+ }
+ else if (destinationType.equals("javax.jms.Queue"))
+ {
+ log.debug("Got destination type Queue");
+ QueueConnectionFactory queueFactory =
+ (QueueConnectionFactory)context.lookup(adapter.getQueueFactoryRef());
- pool = poolFactory.
- getServerSessionPool(
- topicConnection,
- maxPoolSize,
- //Transacted
- true,
- acknowledgeMode,
- new MessageListenerImpl(this));
-
- // To be no-durable or durable
- if (config.getSubscriptionDurability() !=
- MessageDrivenMetaData.DURABLE_SUBSCRIPTION)
- {
- // Create non durable
- connectionConsumer = topicConnection.
- createConnectionConsumer(
- topic,
- messageSelector,
- pool,
- maxMessagesNr);
- }
- else
- {
- //Durable subscription
- String clientId = config.getClientId();
- String durableName = clientId != null ?
- clientId:
- config.getEjbName();
- connectionConsumer = topicConnection.
- createDurableConnectionConsumer(
- topic,
- durableName,
- messageSelector,
- pool,
- maxMessagesNr);
- }
- // set global connection, so we have something to start() and close()
- connection = topicConnection;
- Logger.debug("Topic connectionConsumer set up");
-
- }
- else if(destinationType.equals("javax.jms.Queue"))
- {
- Logger.debug("Got destination type Queue");
- QueueConnectionFactory queueFactory =
-
(QueueConnectionFactory)context.lookup(adapter.getQueueFactoryRef());
+ // Do we have a user
+ QueueConnection queueConnection;
+ if (user != null)
+ {
+ queueConnection = queueFactory.
+ createQueueConnection(user, config.getPasswd());
+ }
+ else
+ {
+ queueConnection = queueFactory.createQueueConnection();
+ }
+
+ // Lookup destination
+ // First Try a lookup.
+ // If that lookup fails then try to contact the MBeanServer and inoke a
new...
+ // Then do lookup again..
+ String queueJndi = "queue/"+jndiSuffix;
+ Queue queue;
+ try {
+ queue = (Queue)context.lookup(queueJndi);
+ } catch(NamingException ne) {
+ log.error("JndiName not found:"+queueJndi +
+ "...attempting to recover", ne);
+ server.invoke(new ObjectName("JMS:service=JMSServer"),
+ "newQueue", new Object[]{jndiSuffix},
+ new String[] {"java.lang.String"});
+ queue = (Queue)context.lookup(queueJndi);
+ }
- // Do we have a user
- QueueConnection queueConnection;
- if (user != null)
- {
- queueConnection = queueFactory.
- createQueueConnection(
- user,
- config.getPasswd());
- }
- else
- {
- queueConnection = queueFactory.createQueueConnection();
- }
-
- // Lookup destination
- // First Try a lookup.
- // If that lookup fails then try to contact the MBeanServer and inoke a
new...
- // Then do lookup again..
- String queueJndi = "queue/"+jndiSuffix;
- Queue queue;
- try
- {
- queue = (Queue)context.lookup(queueJndi);
- }
- catch(NamingException ne){
- Logger.log("JndiName not found:"+queueJndi + "...attempting to
recover");
- server.invoke(new ObjectName("JMS:service=JMSServer"), "newQueue",
new Object[]{jndiSuffix}, new String[] {"java.lang.String"});
- queue = (Queue)context.lookup(queueJndi);
- }
-
- pool = poolFactory.
- getServerSessionPool(
- queueConnection,
- maxPoolSize,
- //Transacted
- true,
- acknowledgeMode,
- new MessageListenerImpl(this));
-
-
- connectionConsumer = queueConnection.
- createConnectionConsumer(
- queue,
- messageSelector,
- pool,
- maxMessagesNr);
-
- // set global connection, so we have something to start() and close()
- connection = queueConnection;
- Logger.debug("Queue connectionConsumer set up");
- }
- }
-
- // Start the connection
- public void start()
- throws Exception
- {
- Logger.debug("Starting JMSContainerInvoker");
- exListener = new ExceptionListenerImpl(this);
- connection.setExceptionListener(exListener);
- connection.start();
- }
-
- // Stop the connection
- public void stop()
- {
- Logger.debug("Stopping JMSContainerInvoker");
- // Silence the exception listener
- if (exListener != null)
- exListener.stop();
- innerStop();
-
- }
+ pool = poolFactory.
+ getServerSessionPool(queueConnection,
+ maxPoolSize,
+ //Transacted
+ true,
+ acknowledgeMode,
+ new MessageListenerImpl(this));
+
+ connectionConsumer = queueConnection.
+ createConnectionConsumer(queue,
+ messageSelector,
+ pool,
+ maxMessagesNr);
+
+ // set global connection, so we have something to
+ // start() and close()
+ connection = queueConnection;
+ log.debug("Queue connectionConsumer set up");
+ }
+ }
- // Stop done from inside, we should not stop the exceptionListener in
- // inner stop
- protected void innerStop() {
- try {
- if (connection != null)
- connection.setExceptionListener(null);
-
- }catch(Exception se) {
- Logger.log("Could not set JMSContainerInvoker ExceptionListener to null :"
+ se);
- }
-
- // Stop the connection
- try {
- if(connection != null)
- connection.stop();
- }catch(Exception cs) {
- Logger.log("Could not stop JMS connection:" + cs);
- }
- }
-
-
- // Take down all fixtures
- public void destroy()
- {
- Logger.debug("Destroying JMSContainerInvoker");
- try {
- if (pool instanceof org.jboss.jms.asf.StdServerSessionPool) {
- org.jboss.jms.asf.StdServerSessionPool p =
- (org.jboss.jms.asf.StdServerSessionPool)pool;
- p.clear();
- }
- }catch(Exception pe) {
- Logger.log("Could not clear ServerSessionPool:" + pe);
- }
-
-
- try {
- if (connectionConsumer != null)
- connectionConsumer.close();
- }catch(Exception ex) {
- Logger.log("Could not close JMSContainerInvoker consumer:" + ex);
- }
- try {
- if (connection != null)
- connection.close();
- }catch(Exception ex) {
- Logger.log("Could not close JMSContainerInvoker connection:" + ex);
- }
- }
-
- // XmlLoadable implementation
- public void importXml(Element element) throws DeploymentException
- {
-
- try {
- String maxMessages =
MetaData.getElementContent(MetaData.getUniqueChild(element, "MaxMessages"));
- maxMessagesNr = Integer.parseInt(maxMessages);
- String maxSize =
MetaData.getElementContent(MetaData.getUniqueChild(element, "MaximumSize"));
- maxPoolSize = Integer.parseInt(maxSize);
- } catch(NumberFormatException e) {
- //Noop will take default value
- } catch(DeploymentException e) {
- //Noop will take default value
- }
-
- // If these are not found we will get a DeploymentException, I hope
- jMSProviderAdapterJNDI =
MetaData.getElementContent(MetaData.getUniqueChild(element, "JMSProviderAdapterJNDI"));
- serverSessionPoolFactoryJNDI =
MetaData.getElementContent(MetaData.getUniqueChild(element,
"ServerSessionPoolFactoryJNDI"));
+ // Start the connection
+ public void start()
+ throws Exception
+ {
+ log.debug("Starting JMSContainerInvoker");
+ exListener = new ExceptionListenerImpl(this);
+ connection.setExceptionListener(exListener);
+ connection.start();
+ }
+
+ // Stop the connection
+ public void stop()
+ {
+ log.debug("Stopping JMSContainerInvoker");
+ // Silence the exception listener
+ if (exListener != null) {
+ exListener.stop();
+ }
+ innerStop();
- // Check java:/ prefix
- if (!jMSProviderAdapterJNDI.startsWith("java:/"))
- jMSProviderAdapterJNDI = "java:/"+jMSProviderAdapterJNDI;
- if (!serverSessionPoolFactoryJNDI.startsWith("java:/"))
- serverSessionPoolFactoryJNDI = "java:/"+serverSessionPoolFactoryJNDI;
- }
+ }
+
+ /**
+ * Stop done from inside, we should not stop the
+ * exceptionListener in inner stop.
+ */
+ protected void innerStop() {
+ try {
+ if (connection != null) {
+ connection.setExceptionListener(null);
+ }
+ } catch (Exception e) {
+ log.error("Could not set ExceptionListener to null", e);
+ }
+
+ // Stop the connection
+ try {
+ if (connection != null) {
+ connection.stop();
+ }
+ } catch (Exception e) {
+ log.error("Could not stop JMS connection", e);
+ }
+ }
- // Package protected ---------------------------------------------
+ // Take down all fixtures
+ public void destroy()
+ {
+ log.debug("Destroying JMSContainerInvoker");
+ try {
+ if (pool instanceof StdServerSessionPool) {
+ StdServerSessionPool p = (StdServerSessionPool)pool;
+ p.clear();
+ }
+ } catch (Exception e) {
+ log.error("Could not clear ServerSessionPool", e);
+ }
+
+ try {
+ if (connectionConsumer != null) {
+ connectionConsumer.close();
+ }
+ } catch(Exception e) {
+ log.error("Could not close consumer", e);
+ }
+
+ try {
+ if (connection != null) {
+ connection.close();
+ }
+ } catch(Exception e) {
+ log.error("Could not close connection", e);
+ }
+ }
- // Protected -----------------------------------------------------
+ // XmlLoadable implementation
+ public void importXml(Element element) throws DeploymentException
+ {
+ try {
+ String maxMessages = MetaData.getElementContent
+ (MetaData.getUniqueChild(element, "MaxMessages"));
+ maxMessagesNr = Integer.parseInt(maxMessages);
+
+ String maxSize = MetaData.getElementContent
+ (MetaData.getUniqueChild(element, "MaximumSize"));
+ maxPoolSize = Integer.parseInt(maxSize);
+ } catch(NumberFormatException e) {
+ //Noop will take default value
+ } catch(DeploymentException e) {
+ //Noop will take default value
+ }
+
+ // If these are not found we will get a DeploymentException, I hope
+ providerAdapterJNDI = MetaData.getElementContent
+ (MetaData.getUniqueChild(element, "JMSProviderAdapterJNDI"));
+
+ serverSessionPoolFactoryJNDI = MetaData.getElementContent
+ (MetaData.getUniqueChild(element, "ServerSessionPoolFactoryJNDI"));
+
+ // Check java:/ prefix
+ if (!providerAdapterJNDI.startsWith("java:/"))
+ providerAdapterJNDI = "java:/"+providerAdapterJNDI;
+
+ if (!serverSessionPoolFactoryJNDI.startsWith("java:/"))
+ serverSessionPoolFactoryJNDI = "java:/"+serverSessionPoolFactoryJNDI;
+ }
- // Private -------------------------------------------------------
- // Inner classes -------------------------------------------------
- class MessageListenerImpl implements MessageListener {
-
-
- JMSContainerInvoker invoker = null;
-
-
- MessageListenerImpl(JMSContainerInvoker invoker) {
- this.invoker = invoker;
- }
- public void onMessage(Message message)
- {
- /*
- Logger.debug(
- "[" + Thread.currentThread().hashCode() +
- "] Processing message " + message);
- */
- Object id;
- try {
- id = message.getJMSMessageID();
- }catch(javax.jms.JMSException ex) {
- id = "JMSContainerInvoke";
- }
- // Invoke, shuld we catch any Exceptions??
- try {
- invoker.invoke(
- // Object id - where used?
- id,
- // Method to invoke
- listenerMethod,
- //argument
- new Object[] {message},
- //Transaction
- tm.getTransaction(),
- //Principal
- null,
- //Cred
- null);
- }catch(Exception ex) {
- Logger.log("Exception in JMSCI message listener: : " + ex);
- ex.printStackTrace();
- }
-
- }
+ // Package protected ---------------------------------------------
+
+ // Protected -----------------------------------------------------
+
+ // Private -------------------------------------------------------
+
+ // Inner classes -------------------------------------------------
+
+ class MessageListenerImpl
+ implements MessageListener
+ {
+ JMSContainerInvoker invoker = null;
- }
+ MessageListenerImpl(final JMSContainerInvoker invoker) {
+ this.invoker = invoker;
+ }
+
+ public void onMessage(Message message)
+ {
+ if (log.isDebugEnabled()) {
+ log.debug("processing message: " + message);
+ }
+
+ Object id;
+ try {
+ id = message.getJMSMessageID();
+ } catch(javax.jms.JMSException e) {
+ id = "JMSContainerInvoke";
+ }
+
+ // Invoke, shuld we catch any Exceptions??
+ try {
+ invoker.invoke(// Object id - where used?
+ id,
+ // Method to invoke
+ ON_MESSAGE,
+ //argument
+ new Object[] {message},
+ //Transaction
+ tm.getTransaction(),
+ //Principal
+ null,
+ //Cred
+ null);
+ } catch(Exception e) {
+ log.error("Exception in JMSCI message listener", e);
+ }
+ }
+ }
- /**
- * ExceptionListener for failover handling.
- */
- class ExceptionListenerImpl implements ExceptionListener {
- JMSContainerInvoker invoker = null;
- Thread currentThread = null;
- boolean notStoped = true;
-
- ExceptionListenerImpl(JMSContainerInvoker invoker) {
- this.invoker = invoker;
- }
-
- void stop() {
- notStoped = false;
- if ( currentThread != null) currentThread.interrupt();
- }
+ /**
+ * ExceptionListener for failover handling.
+ */
+ class ExceptionListenerImpl
+ implements ExceptionListener
+ {
+ JMSContainerInvoker invoker; // = null;
+ Thread currentThread; // = null;
+ boolean notStoped; // = true;
+
+ ExceptionListenerImpl(final JMSContainerInvoker invoker) {
+ this.invoker = invoker;
+ }
+
+ void stop() {
+ log.debug("stop requested");
+
+ notStoped = false;
+ if (currentThread != null) {
+ currentThread.interrupt();
+ log.debug("current thread interrupted");
+ }
+ }
- public void onException(JMSException ex) {
- currentThread = Thread.currentThread();
+ public void onException(JMSException ex) {
+ currentThread = Thread.currentThread();
- Logger.warning("MDB lost connection to provider");
- boolean tryIt = true;
- while(tryIt && notStoped) {
- Logger.log("MDB Trying to reconnect...");
- try {
- try {
- Thread.sleep(10000);
- }catch(InterruptedException ie) { tryIt=false; return;}
- // Reboot container
- invoker.innerStop();
- invoker.destroy();
- invoker.init();
- invoker.start();
- tryIt = false;
- Logger.log("OK - reconnected");
- }catch(Exception e) {
- Logger.log("MDB error reconnecting: " +e);
- }
+ log.warn("MDB lost connection to provider", ex);
+ boolean tryIt = true;
+ while(tryIt && notStoped) {
+ log.info("MDB Trying to reconnect...");
+ try {
+ try {
+ Thread.sleep(10000);
+ } catch (InterruptedException ie) {
+ tryIt=false; return;
+ }
+
+ // Reboot container
+ invoker.innerStop();
+ invoker.destroy();
+ invoker.init();
+ invoker.start();
+ tryIt = false;
+ log.info("OK - reconnected");
}
- currentThread = null;
- }
-
- }
+ catch(Exception e) {
+ log.error("MDB error reconnecting", e);
+ }
+ }
+ currentThread = null;
+ }
+ }
}
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development