You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by di...@apache.org on 2005/12/08 22:48:10 UTC

svn commit: r355228 - in /webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms: JMSOutTransportInfo.java JMSSender.java JMSTransport.java SimpleJMSListener.java SimpleJMSWorker.java

Author: dims
Date: Thu Dec  8 13:48:06 2005
New Revision: 355228

URL: http://svn.apache.org/viewcvs?rev=355228&view=rev
Log:
- Collapse JMSTransport into JMSSender
- Don't store connector in TransportInfo


Removed:
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/JMSTransport.java
Modified:
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/JMSOutTransportInfo.java
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/JMSSender.java
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/SimpleJMSListener.java
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/SimpleJMSWorker.java

Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/JMSOutTransportInfo.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/JMSOutTransportInfo.java?rev=355228&r1=355227&r2=355228&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/JMSOutTransportInfo.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/JMSOutTransportInfo.java Thu Dec  8 13:48:06 2005
@@ -19,16 +19,16 @@
 import org.apache.axis2.transport.OutTransportInfo;
 
 import javax.jms.Destination;
+import java.util.HashMap;
 
 public class JMSOutTransportInfo implements OutTransportInfo {
-    JMSConnector connector = null;
     Destination dest = null;
     String contentType = null;
+    HashMap properties = new HashMap();
 
-    JMSOutTransportInfo(JMSConnector connector, Destination dest) {
-        this.connector = connector;
+    JMSOutTransportInfo(Destination dest, HashMap properties) {
         this.dest = dest;
-
+        this.properties.putAll(properties);
     }
 
     public void setContentType(String contentType) {
@@ -38,8 +38,8 @@
     public Destination getDestination() {
         return dest;
     }
-
-    public JMSConnector getConnector() {
-        return connector;
+    
+    public HashMap getProperties() {
+        return properties;
     }
 }

Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/JMSSender.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/JMSSender.java?rev=355228&r1=355227&r2=355228&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/JMSSender.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/JMSSender.java Thu Dec  8 13:48:06 2005
@@ -24,11 +24,14 @@
 import org.apache.axis2.context.OperationContext;
 import org.apache.axis2.description.Parameter;
 import org.apache.axis2.description.TransportOutDescription;
+import org.apache.axis2.handlers.AbstractHandler;
 import org.apache.axis2.i18n.Messages;
 import org.apache.axis2.om.OMElement;
 import org.apache.axis2.om.OMOutputFormat;
 import org.apache.axis2.soap.SOAPEnvelope;
 import org.apache.axis2.transport.TransportSender;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 import javax.jms.Destination;
 import java.io.ByteArrayInputStream;
@@ -42,10 +45,25 @@
 /**
  * This is meant to be used on a SOAP Client to call a SOAP server.
  */
-public class JMSSender extends JMSTransport implements TransportSender {
+public class JMSSender extends AbstractHandler implements TransportSender {
+
+    protected static Log log =
+            LogFactory.getLog(JMSSender.class.getName());
 
     HashMap params = new HashMap();
 
+    static {
+        // add a shutdown hook to close JMS connections
+        Runtime.getRuntime().addShutdownHook(
+                new Thread() {
+                    public void run() {
+                        JMSSender.closeAllConnectors();
+                    }
+                }
+        );
+    }
+
+
     public JMSSender() {
     }
 
@@ -66,35 +84,50 @@
      */
     public void invoke(MessageContext msgContext) throws AxisFault {
         JMSConnector connector = null;
+        HashMap properties = null;
+
         Destination dest = null;
         if (msgContext.isServerSide()) {
             JMSOutTransportInfo transportInfo =
                     (JMSOutTransportInfo) msgContext.getProperty(
                             Constants.OUT_TRANSPORT_INFO);
             if (transportInfo != null) {
-                connector = transportInfo.getConnector();
                 dest = transportInfo.getDestination();
+                properties = transportInfo.getProperties();
             }
         }
 
+        String endpointAddress = msgContext.getTo().getAddress();
+
         boolean waitForResponse = false;
-        if (connector == null) {
+        if (dest == null) {
             if (msgContext.getProperty(JMSConstants.WAIT_FOR_RESPONSE) != null && msgContext.getProperty(JMSConstants.WAIT_FOR_RESPONSE).equals(Boolean.TRUE))
                 waitForResponse =
                         ((Boolean) msgContext.getProperty(
                                 JMSConstants.WAIT_FOR_RESPONSE)).booleanValue();
-
-            super.invoke(msgContext);
+        } else {
+            if (properties != null) {
+                JMSURLHelper url = null;
+                try {
+                    url = new JMSURLHelper("jms:/" + dest);
+                } catch (Exception e) {
+                    throw AxisFault.makeFault(e);
+                }
+                url.getProperties().putAll(properties);
+                endpointAddress = url.getURLString();
+            }
         }
 
+        setupTransport(msgContext, endpointAddress);
+
+        if (connector == null) {
+            connector = (JMSConnector) msgContext.getProperty(JMSConstants.CONNECTOR);
+        }
         try {
             JMSEndpoint endpoint = null;
             if (dest == null) {
                 Object destination = msgContext.getProperty(JMSConstants.DESTINATION);
 
-                if (connector == null) {
-                    connector = (JMSConnector) msgContext.getProperty(JMSConstants.CONNECTOR);
-                }
                 if (destination == null && msgContext.getTo() != null) {
                     String to = msgContext.getTo().getAddress();
                     if (to != null) {
@@ -258,5 +291,168 @@
             soapActionString = "";
         }
         return soapActionString;
+    }
+
+    /**
+     * Set up any transport-specific derived properties in the message context.
+     *
+     * @param context the context to set up
+     * @throws AxisFault if service cannot be found
+     */
+    public void setupTransport(MessageContext context, String endpointAddr)
+            throws AxisFault {
+        if (log.isDebugEnabled()) {
+            log.debug("Enter: JMSTransport::invoke");
+        }
+
+        JMSConnector connector = null;
+        HashMap connectorProperties = null;
+        HashMap connectionFactoryProperties = null;
+
+        JMSVendorAdapter vendorAdapter = null;
+        JMSURLHelper jmsurl = null;
+
+        // a security context is required to create/use JMSConnectors
+        // TODO: Fill username password from context
+        String username = "";
+        String password = "";
+
+        // the presence of an endpoint address indicates whether the client application
+        //  is instantiating the JMSTransport directly (deprecated) or indirectly via JMS URL
+
+        if (endpointAddr != null) {
+            try {
+                // performs minimal validation ('jms:/destination?...')
+                jmsurl = new JMSURLHelper(endpointAddr);
+
+                // lookup the appropriate vendor adapter
+                String vendorId = jmsurl.getVendor();
+                if (vendorId == null)
+                    vendorId = JMSConstants.JNDI_VENDOR_ID;
+
+                if (log.isDebugEnabled())
+                    log.debug("JMSTransport.invoke(): endpt=" + endpointAddr +
+                            ", vendor=" + vendorId);
+
+                vendorAdapter = JMSVendorAdapterFactory.getJMSVendorAdapter(vendorId);
+                if (vendorAdapter == null) {
+                    throw new AxisFault("cannotLoadAdapterClass:" + vendorId);
+                }
+
+                // populate the connector and connection factory properties tables
+                connectorProperties = vendorAdapter.getJMSConnectorProperties(jmsurl);
+                connectionFactoryProperties = vendorAdapter.getJMSConnectionFactoryProperties(jmsurl);
+            }
+            catch (Exception e) {
+                log.error(Messages.getMessage("malformedURLException00"), e);
+                throw new AxisFault(Messages.getMessage("malformedURLException00"), e);
+            }
+        } else {
+            // the JMSTransport was instantiated directly, use the default adapter
+            try {
+                vendorAdapter = JMSVendorAdapterFactory.getJMSVendorAdapter();
+            } catch (Exception e) {
+                throw new AxisFault("cannotLoadAdapterClass");
+            }
+
+            // use the properties passed in to the constructor
+            connectorProperties = params;
+            connectionFactoryProperties = params;
+        }
+
+        try {
+            connector = JMSConnectorManager.getInstance().getConnector(connectorProperties, connectionFactoryProperties,
+                    username, password, vendorAdapter);
+        }
+        catch (Exception e) {
+            log.error(Messages.getMessage("cannotConnectError"), e);
+
+            if (e instanceof AxisFault)
+                throw (AxisFault) e;
+            throw new AxisFault("cannotConnect", e);
+        }
+
+        // store these in the context for later use
+        context.setProperty(JMSConstants.CONNECTOR, connector);
+        context.setProperty(JMSConstants.VENDOR_ADAPTER, vendorAdapter);
+
+        // vendors may populate the message context
+        vendorAdapter.setupMessageContext(context, jmsurl);
+
+        if (log.isDebugEnabled()) {
+            log.debug("Exit: JMSTransport::invoke");
+        }
+    }
+
+    /**
+     * Shuts down the connectors managed by this JMSTransport.
+     */
+    public void shutdown() {
+        if (log.isDebugEnabled()) {
+            log.debug("Enter: JMSTransport::shutdown");
+        }
+
+        closeAllConnectors();
+
+        if (log.isDebugEnabled()) {
+            log.debug("Exit: JMSTransport::shutdown");
+        }
+    }
+
+    /**
+     * Closes all JMS connectors
+     */
+    public static void closeAllConnectors() {
+        if (log.isDebugEnabled()) {
+            log.debug("Enter: JMSTransport::closeAllConnectors");
+        }
+
+        JMSConnectorManager.getInstance().closeAllConnectors();
+
+        if (log.isDebugEnabled()) {
+            log.debug("Exit: JMSTransport::closeAllConnectors");
+        }
+    }
+
+    /**
+     * Closes JMS connectors that match the specified endpoint address
+     *
+     * @param endpointAddr the JMS endpoint address
+     * @param username
+     * @param password
+     */
+    public static void closeMatchingJMSConnectors(String endpointAddr, String username, String password) {
+        if (log.isDebugEnabled()) {
+            log.debug("Enter: JMSTransport::closeMatchingJMSConnectors");
+        }
+
+        try {
+            JMSURLHelper jmsurl = new JMSURLHelper(endpointAddr);
+            String vendorId = jmsurl.getVendor();
+
+            JMSVendorAdapter vendorAdapter = null;
+            if (vendorId == null)
+                vendorId = JMSConstants.JNDI_VENDOR_ID;
+            vendorAdapter = JMSVendorAdapterFactory.getJMSVendorAdapter(vendorId);
+
+            // the vendor adapter may not exist
+            if (vendorAdapter == null)
+                return;
+
+            // determine the set of properties to be used for matching the connection
+            HashMap connectorProps = vendorAdapter.getJMSConnectorProperties(jmsurl);
+            HashMap cfProps = vendorAdapter.getJMSConnectionFactoryProperties(jmsurl);
+
+            JMSConnectorManager.getInstance().closeMatchingJMSConnectors(connectorProps, cfProps,
+                    username, password,
+                    vendorAdapter);
+        }
+        catch (Exception e) {
+            log.warn(Messages.getMessage("malformedURLException00"), e);
+        }
+
+        if (log.isDebugEnabled()) {
+            log.debug("Exit: JMSTransport::closeMatchingJMSConnectors");
+        }
     }
 }

Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/SimpleJMSListener.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/SimpleJMSListener.java?rev=355228&r1=355227&r2=355228&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/SimpleJMSListener.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/SimpleJMSListener.java Thu Dec  8 13:48:06 2005
@@ -242,4 +242,8 @@
 
         System.exit(1);
     }
+
+    public HashMap getProperties() {
+        return properties;
+    }
 }

Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/SimpleJMSWorker.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/SimpleJMSWorker.java?rev=355228&r1=355227&r2=355228&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/SimpleJMSWorker.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/transport/jms/SimpleJMSWorker.java Thu Dec  8 13:48:06 2005
@@ -21,6 +21,7 @@
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.description.TransportOutDescription;
+import org.apache.axis2.description.TransportInDescription;
 import org.apache.axis2.engine.AxisEngine;
 import org.apache.axis2.i18n.Messages;
 import org.apache.axis2.om.OMException;
@@ -117,19 +118,19 @@
 
         MessageContext msgContext;
         try {
+            TransportInDescription transportIn =
+                    configurationContext.getAxisConfiguration().getTransportIn(
+                            new QName(Constants.TRANSPORT_JMS));
             TransportOutDescription transportOut =
                     configurationContext.getAxisConfiguration().getTransportOut(
                             new QName(Constants.TRANSPORT_JMS));
             msgContext = new MessageContext(
-                    configurationContext);
-            //,
-            //        configurationContext.getAxisConfiguration().getTransportIn(
-            //                new QName(Constants.TRANSPORT_JMS)),
-            //        transportOut);
+                    configurationContext,
+                    transportIn,
+                    transportOut);
             msgContext.setProperty(
                     Constants.OUT_TRANSPORT_INFO,
-                    new JMSOutTransportInfo(listener.getConnector(), message.getJMSReplyTo()));
-
+                    new JMSOutTransportInfo(message.getJMSReplyTo(), listener.getProperties()));
             msgContext.setTransportOut(transportOut);
             msgContext.setServerSide(true);
         } catch (Exception e) {