You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@geronimo.apache.org by Donald Woods <dw...@apache.org> on 2007/07/25 16:07:59 UTC

Re: svn commit: r559301 - in /geronimo/server/trunk/modules: geronimo-axis/src/main/java/org/apache/geronimo/axis/client/AxisServiceReference.java geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/JAXWSServiceReference.java

Should this (along with r559306 and r559321) also go into branches/2.0?


-Donald

gawor@apache.org wrote:
> Author: gawor
> Date: Tue Jul 24 20:25:14 2007
> New Revision: 559301
> 
> URL: http://svn.apache.org/viewvc?view=rev&rev=559301
> Log:
> cache generated classes for service-refs - should reduce perm gen OOM errors (jaxrpc needs one more fix)
> 
> Modified:
>     geronimo/server/trunk/modules/geronimo-axis/src/main/java/org/apache/geronimo/axis/client/AxisServiceReference.java
>     geronimo/server/trunk/modules/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/JAXWSServiceReference.java
> 
> Modified: geronimo/server/trunk/modules/geronimo-axis/src/main/java/org/apache/geronimo/axis/client/AxisServiceReference.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-axis/src/main/java/org/apache/geronimo/axis/client/AxisServiceReference.java?view=diff&rev=559301&r1=559300&r2=559301
> ==============================================================================
> --- geronimo/server/trunk/modules/geronimo-axis/src/main/java/org/apache/geronimo/axis/client/AxisServiceReference.java (original)
> +++ geronimo/server/trunk/modules/geronimo-axis/src/main/java/org/apache/geronimo/axis/client/AxisServiceReference.java Tue Jul 24 20:25:14 2007
> @@ -44,6 +44,10 @@
>      private Map seiClassNameToFactoryMap;
>      private ClassLoader classLoader;
>  
> +    private FastConstructor serviceConstructor;
> +    private Callback[] methodInterceptors;
> +    private Class enhancedServiceClass;
> +
>      public AxisServiceReference(String serviceInterfaceClassName, Map seiPortNameToFactoryMap, Map seiClassNameToFactoryMap) {
>          this.serviceInterfaceClassName = serviceInterfaceClassName;
>          this.seiPortNameToFactoryMap = seiPortNameToFactoryMap;
> @@ -75,24 +79,35 @@
>      }
>  
>      private Object createServiceInterfaceProxy(Class serviceInterface, Map seiPortNameToFactoryMap, Map seiClassNameToFactoryMap, ClassLoader classLoader) throws NamingException {
> -
> -        Callback callback = new ServiceMethodInterceptor(seiPortNameToFactoryMap);
> -        Callback[] methodInterceptors = new Callback[]{SerializableNoOp.INSTANCE, callback};
> -
> -        Enhancer enhancer = new Enhancer();
> -        enhancer.setClassLoader(classLoader);
> -        enhancer.setSuperclass(ServiceImpl.class);
> -        enhancer.setInterfaces(new Class[]{serviceInterface});
> -        enhancer.setCallbackFilter(new NoOverrideCallbackFilter(Service.class));
> -        enhancer.setCallbackTypes(new Class[]{NoOp.class, MethodInterceptor.class});
> -        enhancer.setUseFactory(false);
> -        enhancer.setUseCache(false);
> -        Class serviceClass = enhancer.createClass();
> -
> -        Enhancer.registerCallbacks(serviceClass, methodInterceptors);
> -        FastConstructor constructor = FastClass.create(serviceClass).getConstructor(SERVICE_CONSTRUCTOR_TYPES);
> +        if (this.serviceConstructor == null) {
> +            // create method interceptors
> +            Callback callback = new ServiceMethodInterceptor(seiPortNameToFactoryMap);
> +            this.methodInterceptors = new Callback[]{SerializableNoOp.INSTANCE, callback};
> +
> +            // create service class
> +            Enhancer enhancer = new Enhancer();
> +            enhancer.setClassLoader(classLoader);
> +            enhancer.setSuperclass(ServiceImpl.class);
> +            enhancer.setInterfaces(new Class[]{serviceInterface});
> +            enhancer.setCallbackFilter(new NoOverrideCallbackFilter(Service.class));
> +            enhancer.setCallbackTypes(new Class[]{NoOp.class, MethodInterceptor.class});
> +            enhancer.setUseFactory(false);
> +            enhancer.setUseCache(false);
> +            this.enhancedServiceClass = enhancer.createClass();
> +
> +            // get constructor
> +            this.serviceConstructor = 
> +                FastClass.create(this.enhancedServiceClass).getConstructor(SERVICE_CONSTRUCTOR_TYPES);
> +        }
> +        
> +        // associate the method interceptors with the generated service class on the current thread
> +        Enhancer.registerCallbacks(this.enhancedServiceClass, this.methodInterceptors);
> +        
> +        Object[] arguments =
> +            new Object[] {seiPortNameToFactoryMap, seiClassNameToFactoryMap};
> +        
>          try {
> -            return constructor.newInstance(new Object[]{seiPortNameToFactoryMap, seiClassNameToFactoryMap});
> +            return this.serviceConstructor.newInstance(arguments);
>          } catch (InvocationTargetException e) {
>              throw (NamingException)new NamingException("Could not construct service instance").initCause(e.getTargetException());
>          }
> 
> Modified: geronimo/server/trunk/modules/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/JAXWSServiceReference.java
> URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/JAXWSServiceReference.java?view=diff&rev=559301&r1=559300&r2=559301
> ==============================================================================
> --- geronimo/server/trunk/modules/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/JAXWSServiceReference.java (original)
> +++ geronimo/server/trunk/modules/geronimo-jaxws/src/main/java/org/apache/geronimo/jaxws/client/JAXWSServiceReference.java Tue Jul 24 20:25:14 2007
> @@ -46,6 +46,7 @@
>      private static final Log LOG = LogFactory.getLog(JAXWSServiceReference.class);
>      private static final Class[] URL_SERVICE_NAME_CONSTRUCTOR =
>          new Class[] { URL.class, QName.class };
> +    
>      protected String serviceClassName;
>      protected ClassLoader classLoader;
>      protected AbstractName moduleName;
> @@ -55,17 +56,21 @@
>      protected String handlerChainsXML;
>      protected Map<Object, EndpointInfo> seiInfoMap;
>      protected String referenceClassName;
> +    
> +    protected Class enhancedServiceClass;
> +    protected Callback[] methodInterceptors;
> +    protected FastConstructor serviceConstructor;
>  
>      public JAXWSServiceReference(String handlerChainsXML, Map<Object, EndpointInfo> seiInfoMap, AbstractName name, QName serviceQName, URI wsdlURI, String referenceClassName, String serviceClassName) {
>          this.handlerChainsXML = handlerChainsXML;
>          this.seiInfoMap = seiInfoMap;
> -        moduleName = name;
> +        this.moduleName = name;
>          this.serviceQName = serviceQName;
>          this.wsdlURI = wsdlURI;
>          this.referenceClassName = referenceClassName;
>          this.serviceClassName = serviceClassName;
>      }
> -
> +    
>      public void setClassLoader(ClassLoader classLoader) {
>          this.classLoader = classLoader;
>      }
> @@ -149,29 +154,35 @@
>      }
>      
>      private Service createServiceProxy(Class superClass, ClassLoader classLoader, QName serviceName, URL wsdlLocation) throws NamingException {
> -        Callback callback = getPortMethodInterceptor();
> -        Callback[] methodInterceptors = new Callback[]{NoOp.INSTANCE, callback};
> -
> -        Enhancer enhancer = new Enhancer();
> -        enhancer.setClassLoader(classLoader);
> -        enhancer.setSuperclass(superClass);
> -        enhancer.setCallbackFilter(new PortMethodFilter());
> -        enhancer.setCallbackTypes(new Class[]{NoOp.class, MethodInterceptor.class});
> -        enhancer.setUseFactory(false);
> -        enhancer.setUseCache(false);
> -        Class serviceClass = enhancer.createClass();
> -
> -        Enhancer.registerCallbacks(serviceClass, methodInterceptors);
> -
> -        FastConstructor constructor =
> -            FastClass.create(serviceClass).getConstructor(URL_SERVICE_NAME_CONSTRUCTOR);
> -        Object[] arguments =
> -            new Object[]{wsdlLocation, serviceName};
> -
> +        if (this.serviceConstructor == null) {            
> +            // create method interceptors
> +            Callback callback = getPortMethodInterceptor();
> +            this.methodInterceptors = new Callback[] {NoOp.INSTANCE, callback};
> +
> +            // create service class
> +            Enhancer enhancer = new Enhancer();
> +            enhancer.setClassLoader(classLoader);
> +            enhancer.setSuperclass(superClass);
> +            enhancer.setCallbackFilter(new PortMethodFilter());
> +            enhancer.setCallbackTypes(new Class[] { NoOp.class, MethodInterceptor.class });
> +            enhancer.setUseFactory(false);
> +            enhancer.setUseCache(false);
> +            this.enhancedServiceClass = enhancer.createClass(); 
> +
> +            // get constructor
> +            this.serviceConstructor = 
> +                FastClass.create(this.enhancedServiceClass).getConstructor(URL_SERVICE_NAME_CONSTRUCTOR);
> +        }
> +        
>          LOG.debug("Initializing service with: " + wsdlLocation + " " + serviceName);
>  
> +        // associate the method interceptors with the generated service class on the current thread
> +        Enhancer.registerCallbacks(this.enhancedServiceClass, this.methodInterceptors);
> +        
> +        Object[] arguments = new Object[] {wsdlLocation, serviceName};
> +        
>          try {
> -            return (Service)constructor.newInstance(arguments);
> +            return (Service)this.serviceConstructor.newInstance(arguments);
>          } catch (InvocationTargetException e) {
>              NamingException exception = new NamingException("Could not construct service proxy");
>              exception.initCause(e.getTargetException());
> 
> 
> 
>