dchappell 2002/10/16 14:47:58 Modified: java/src/org/apache/axis/components/jms SonicMQVendorAdapter.java JMSVendorAdapter.java Log: Jaime's patch submission from 2 weeks ago. Cleans up exception handling somewhat in that it allows detection of specific detection of things like connection drop vs. "can't create queue". Revision Changes Path 1.2 +76 -0 xml-axis/java/src/org/apache/axis/components/jms/SonicMQVendorAdapter.java Index: SonicMQVendorAdapter.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/components/jms/SonicMQVendorAdapter.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SonicMQVendorAdapter.java 24 Sep 2002 23:47:01 -0000 1.1 +++ SonicMQVendorAdapter.java 16 Oct 2002 21:47:58 -0000 1.2 @@ -60,6 +60,12 @@ import javax.jms.ConnectionFactory; import javax.jms.QueueConnectionFactory; import javax.jms.TopicConnectionFactory; +import javax.jms.JMSException; + +import progress.message.client.EUserAlreadyConnected; +import progress.message.client.ENetworkFailure; + +import progress.message.jclient.ErrorCodes; /** * Defines SonicMQ specific constants for connnection factory creation. @@ -219,5 +225,75 @@ cfConfig = (HashMap)cfConfig.clone(); cfConfig.put(CONNECTION_FACTORY_CLASS, TCF_CLASS); return super.getTopicConnectionFactory(cfConfig); + } + + public boolean isRecoverable(Throwable thrown, int action) + { + //the super class cannot be trusted for on exception because it always + //returns false + if(action != ON_EXCEPTION_ACTION && !super.isRecoverable(thrown, action)) + return false; + + if(!(thrown instanceof JMSException)) + return true; + + JMSException jmse = (JMSException)thrown; + switch(action) + { + case CONNECT_ACTION: + if(isNetworkFailure(jmse)) + return false; + break; + case SUBSCRIBE_ACTION: + + if(isQueueMissing(jmse) || isAnotherSubscriberConnected(jmse)) + return false; + break; + + case ON_EXCEPTION_ACTION: + if(isConnectionDropped(jmse)) + return false; + break; + + } + + return true; + } + + public boolean isConnectionDropped(JMSException jmse) + { + return ErrorCodes.testException(jmse, ErrorCodes.ERR_CONNECTION_DROPPED); + } + + private boolean isQueueMissing(JMSException jmse) + { + String message = jmse.getMessage(); + if(message != null && message.startsWith("Queue not found")) + { + return true; + } + return false; + } + + private boolean isAnotherSubscriberConnected(JMSException jmse) + { + Exception linkedException = jmse.getLinkedException(); + if(linkedException != null && + linkedException instanceof EUserAlreadyConnected) + { + return true; + } + return false; + } + + private boolean isNetworkFailure(JMSException jmse) + { + Exception linkedException = jmse.getLinkedException(); + if(linkedException != null && + linkedException instanceof ENetworkFailure) + { + return true; + } + return false; } } 1.2 +21 -0 xml-axis/java/src/org/apache/axis/components/jms/JMSVendorAdapter.java Index: JMSVendorAdapter.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/components/jms/JMSVendorAdapter.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- JMSVendorAdapter.java 24 Sep 2002 23:47:01 -0000 1.1 +++ JMSVendorAdapter.java 16 Oct 2002 21:47:58 -0000 1.2 @@ -63,6 +63,9 @@ import javax.jms.QueueSession; import javax.jms.Topic; import javax.jms.TopicSession; +import javax.jms.JMSException; +import javax.jms.JMSSecurityException; +import javax.jms.InvalidDestinationException; /** * SPI Interface that all JMSVendorAdaptors must implement. Allows for @@ -73,6 +76,12 @@ public abstract class JMSVendorAdapter { + public static final int SEND_ACTION = 0; + public static final int CONNECT_ACTION = 1; + public static final int SUBSCRIBE_ACTION = 2; + public static final int RECEIVE_ACTION = 3; + public static final int ON_EXCEPTION_ACTION = 4; + public abstract QueueConnectionFactory getQueueConnectionFactory(HashMap cfProps) throws Exception; @@ -91,5 +100,17 @@ return session.createTopic(name); } + + public boolean isRecoverable(Throwable thrown, int action) + { + if(thrown instanceof RuntimeException || + thrown instanceof Error || + thrown instanceof JMSSecurityException || + thrown instanceof InvalidDestinationException) + return false; + if(action == ON_EXCEPTION_ACTION) + return false; + return true; + } }