Should this (along with r559306 and r559321) also go into branches/2.0?
-Donald [EMAIL PROTECTED] 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());
smime.p7s
Description: S/MIME Cryptographic Signature
