Can i use a switch to keep old behavior? can you please look at the following as well.
- http://issues.apache.org/jira/browse/AXIS-1754 - http://marc.theaimsgroup.com/?l=axis-dev&m=111404132128455&w=2 this check-in was to fix part of that problem (breaks Service's thread-safety) that i forgot about in that last check-in . thanks, -- dims On 4/22/05, Tom Jordahl <[EMAIL PROTECTED]> wrote: > Ack! -1! > > /** > - * Returns last Call object associated with > + * Returns last Call object associated with > * this service. > + * @deprecated please use Stub._getCall > */ > public Call getCall() throws ServiceException { > - return previousCall; > + throw new > ServiceException(Messages.getMessage("useStubsGetCallMethod")); > } > > This is a huge compatibility change. Up until recently (1.1?) you > couldn't get the Call from anywhere but the Service, so there is > probably lots of code out there that does this (including some of mine). > > Please either revert this or make sure you can get the call from the > service. > > Tom Jordahl > Macromedia Server Development > > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] > Sent: Friday, April 22, 2005 7:00 AM > To: [EMAIL PROTECTED] > Subject: cvs commit: ws-axis/java/src/org/apache/axis/client > Service.java Stub.java > > dims 2005/04/22 06:59:29 > > Modified: java/src/org/apache/axis/i18n resource.properties > java/src/org/apache/axis/client Service.java Stub.java > Log: > Fix for AXIS-935 - Using ThreadLocal Call objects in a servlet memory > leak both on client and server side > > After reading tom's comment...moved the _getCall to stub, which > ensures that Service is threadsafe. Added a deprecated flag and an > exception in Service's getCall to point people in the right direction. > > Revision Changes Path > 1.117 +1 -0 > ws-axis/java/src/org/apache/axis/i18n/resource.properties > > Index: resource.properties > =================================================================== > RCS file: > /home/cvs/ws-axis/java/src/org/apache/axis/i18n/resource.properties,v > retrieving revision 1.116 > retrieving revision 1.117 > diff -u -r1.116 -r1.117 > --- resource.properties 13 Apr 2005 16:22:52 -0000 1.116 > +++ resource.properties 22 Apr 2005 13:59:29 -0000 1.117 > @@ -1072,6 +1072,7 @@ > cannotFindObjectForClass00=No object was found for class type {0} > NullDelegate=Null delegate passed to TypeMappingDelegate constructor > optionWrapArrays=Prefers building beans to straight arrays for > wrapped XML array types (defaults to off). > +useStubsGetCallMethod=Please use Stub's _getCall method > > # > # > # In-use keys > # > > 1.108 +14 -18 > ws-axis/java/src/org/apache/axis/client/Service.java > > Index: Service.java > =================================================================== > RCS file: > /home/cvs/ws-axis/java/src/org/apache/axis/client/Service.java,v > retrieving revision 1.107 > retrieving revision 1.108 > diff -u -r1.107 -r1.108 > --- Service.java 20 Apr 2005 23:55:18 -0000 1.107 > +++ Service.java 22 Apr 2005 13:59:29 -0000 1.108 > @@ -79,10 +79,6 @@ > private HandlerRegistryImpl registry = new HandlerRegistryImpl(); > private Parser wsdlParser = null; > > - /** > - * Thread local storage used for storing the last call object > - */ > - private static Call previousCall = null; > private static HashMap cachedWSDL = new HashMap(); > private static boolean cachingWSDL = true; > > @@ -160,7 +156,7 @@ > * > * @param parser Parser for this service > * @param serviceName Qualified name of the desired service > - * @throws ServiceException If there's an error > + * @throws ServiceException If there's an error > */ > public Service(Parser parser, QName serviceName) throws > ServiceException { > this.serviceName = serviceName; > @@ -266,7 +262,7 @@ > > /** > * Code for building up the Service from a Parser > - * > + * > * @param parser Parser for this service > * @param serviceName Qualified name of the desired service > * @throws ServiceException If there's an error finding or > parsing the WSDL > @@ -376,7 +372,7 @@ > // If not found, just pick the first port. > port = (Port) ports.values().iterator().next(); > } > - > + > // First, try to find a generated stub. If that > // returns null, then find a dynamic stub. > Remote stub = getGeneratedStub(new QName(port.getName()), > proxyInterface); > @@ -416,16 +412,16 @@ > Port port = wsdlService.getPort(portName.getLocalPart()); > if (port == null) > throw new > ServiceException(Messages.getMessage("noPort00", "" + > proxyInterface.getName())); > - > + > Binding binding = port.getBinding(); > SymbolTable symbolTable = wsdlParser.getSymbolTable(); > BindingEntry bEntry = > symbolTable.getBindingEntry(binding.getQName()); > if(bEntry.getParameters().size() != > proxyInterface.getMethods().length) { > throw new > ServiceException(Messages.getMessage("incompatibleSEI00", "" + > proxyInterface.getName())); > - } > + } > // TODO: Check the methods and the parameters as well. > } > - > + > try { > Call call = null; > if (portName == null) { > @@ -546,7 +542,6 @@ > */ > public javax.xml.rpc.Call createCall() throws ServiceException { > Call call = new org.apache.axis.client.Call(this); > - previousCall = call; > return call; > } > > @@ -586,7 +581,7 @@ > javax.xml.rpc.Call call = > createCall(QName.valueOf(port.getName()), > > QName.valueOf(operation.getName())); > calls.add(call); > - } > + } > javax.xml.rpc.Call[] array = new > javax.xml.rpc.Call[calls.size()]; > calls.toArray(array); > return array; > @@ -766,10 +761,10 @@ > * lazy engine instantiation work, and not have to duplicate > every single > * Service constructor with a EngineConfiguration argument. > * <p> > - * If you need to use a non-default > <code>EngineConfiguration</code>, do > + * If you need to use a non-default > <code>EngineConfiguration</code>, do > * the following before calling the Service constructor:<p><code> > - * > - * > AxisProperties.setProperty(EngineConfigurationFactory.SYSTEM_PROPERTY_NA > ME, > + * > + * > AxisProperties.setProperty(EngineConfigurationFactory.SYSTEM_PROPERTY_NA > ME, > * > "classname.of.new.EngineConfigurationFactory"); > * </code><p> > * Where the second parameter is the name of your new class that > implements > @@ -786,7 +781,7 @@ > * the getClientEngineConfig() of your own > EngineConfigurationFactory will be > * called, and your configuration will be used in the constructed > Service object.<p> > * > - * Another way is to use the "discovery" method of > + * Another way is to use the "discovery" method of > * <code>EngineConfigurationFactoryFinder</code>. > * > * @param config the EngineConfiguration we want to use. > @@ -828,11 +823,12 @@ > } > > /** > - * Returns last Call object associated with > + * Returns last Call object associated with > * this service. > + * @deprecated please use Stub._getCall > */ > public Call getCall() throws ServiceException { > - return previousCall; > + throw new > ServiceException(Messages.getMessage("useStubsGetCallMethod")); > } > > /** > > 1.41 +23 -9 ws-axis/java/src/org/apache/axis/client/Stub.java > > Index: Stub.java > =================================================================== > RCS file: > /home/cvs/ws-axis/java/src/org/apache/axis/client/Stub.java,v > retrieving revision 1.40 > retrieving revision 1.41 > diff -u -r1.40 -r1.41 > --- Stub.java 8 Oct 2004 18:11:42 -0000 1.40 > +++ Stub.java 22 Apr 2005 13:59:29 -0000 1.41 > @@ -64,6 +64,9 @@ > // a synchronized block in the generated stub code. > private boolean firstCall = true; > > + // The last call object > + private Call _call = null; > + > /** > * Is this the first time the type mappings are being registered? > */ > @@ -325,10 +328,9 @@ > public SOAPHeaderElement getResponseHeader(String namespace, > String partName) { > try > { > - Call lastCall = > ((org.apache.axis.client.Service)service).getCall(); > - if (lastCall == null) > + if (_call == null) > return null; > - return > lastCall.getResponseMessage().getSOAPEnvelope().getHeaderByName(namespac > e, partName); > + return > _call.getResponseMessage().getSOAPEnvelope().getHeaderByName(namespace, > partName); > } > catch (Exception e) > { > @@ -352,10 +354,9 @@ > SOAPHeaderElement[] array = new SOAPHeaderElement[0]; > try > { > - Call lastCall = > ((org.apache.axis.client.Service)service).getCall(); > - if (lastCall == null) > + if (_call == null) > return array; > - Vector h = > lastCall.getResponseMessage().getSOAPEnvelope().getHeaders(); > + Vector h = > _call.getResponseMessage().getSOAPEnvelope().getHeaders(); > array = new SOAPHeaderElement[h.size()]; > h.copyInto(array); > return array; > @@ -394,6 +395,10 @@ > } > > protected void setRequestHeaders(org.apache.axis.client.Call > call) throws AxisFault { > + // HACK: store the _call object. > + _call = call; > + > + // Set the call headers. > SOAPHeaderElement[] headers = getHeaders(); > for(int i=0;i<headers.length;i++){ > call.addHeader(headers[i]); > @@ -407,6 +412,7 @@ > * @throws AxisFault > */ > protected void setAttachments(org.apache.axis.client.Call call) > throws AxisFault { > + // Set the attachments. > Object[] attachments = getAttachments(); > for(int i=0;i<attachments.length;i++){ > call.addAttachmentPart(attachments[i]); > @@ -415,14 +421,22 @@ > } > > /** > - * Provide access to the service object, through which you can > get the Call > - * that is used to process the operations. > - * Not part of JAX-RPC > + * Provide access to the service object. Not part of JAX-RPC > + * > * @return the service object for this stub > */ > public Service _getService() { > return service; > } > + > + /** > + * Returns last Call object associated with > + * this stub. > + */ > + public Call _getCall() { > + return _call; > + } > + > /** > * Helper method for updating headers from the response. > * > > -- Davanum Srinivas - http://webservices.apache.org/~dims/
