[
https://issues.apache.org/jira/browse/AXIS2-2883?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13092669#comment-13092669
]
Carusyte commented on AXIS2-2883:
---------------------------------
I'd like to propose a workaround here, it's been put into production and no
further issue is reported yet. Since I'm not yet familiar with the entire Axis2
internals I am not sure if i can hack the source code. Hope this helps.
public class AxisOperationClientInvoker implements
IServiceInvoker<SOAPEnvelope, SOAPEnvelope> {
private IOptionsConfigurator configurator = null;
private ConfigurationContext configContext = null;
private ServiceClient serviceClient = null;
public AxisOperationClientInvoker() throws AxisFault {
configurator = ServiceClientRegistry.getConfigurator();
configContext = ConfigurationContextFactory
.createConfigurationContextFromFileSystem(null,
null);
serviceClient = new ServiceClient(configContext, null);
// set AUTO_OPERATION_CLEANUP to false so that last http method
resource
// won't be incorrectly cleaned-up in concurrency. But
UESR-CONTROL
// SHOULD BE IMPOSED.
serviceClient.getOptions().setProperty(
ServiceClient.AUTO_OPERATION_CLEANUP, false);
}
@Override
public SOAPEnvelope invokeService(SOAPEnvelope request, Object
identifier)
throws AxisFault {
OperationClient operationClient = serviceClient
.createClient(ServiceClient.ANON_OUT_IN_OP);
MessageContext outMsgCtx = new MessageContext();
outMsgCtx.setEnvelope(request);
operationClient.addMessageContext(outMsgCtx);
Options opts = operationClient.getOptions();
opts.setProperty(IServiceConstants.IDENTIFIER, identifier);
configurator.config(opts);
initConfigurationContext(opts);
SOAPEnvelope response = null;
MessageContext inMsgCtx = null;
try {
operationClient.execute(true);
inMsgCtx = operationClient.getMessageContext("In");
response = getResponse(inMsgCtx);
} catch (UnsupportedEncodingException e) {
AxisFault.makeFault(e);
} catch (XMLStreamException e) {
AxisFault.makeFault(e);
} finally {
cleanupHttpResource(outMsgCtx);
}
return response;
}
private void initConfigurationContext(Options opts) {
configContext.setProperty(HTTPConstants.CACHED_HTTP_CLIENT,
opts.getProperty(HTTPConstants.CACHED_HTTP_CLIENT));
}
private String getCharset(MessageContext msgCtx) {
String charset = (String) msgCtx
.getProperty(Constants.Configuration.CHARACTER_SET_ENCODING);
if (charset == null || !Charset.isSupported(charset))
charset = Charset.defaultCharset().name();
return charset;
}
/**
* <b>VERY IMPORTANT:</b>clean up HTTP related resourceļ¼such as
connection; so that
* the connection pool won't be starved.
*
* @param msgCtx
* @throws AxisFault
*/
private void cleanupHttpResource(MessageContext msgCtx) throws
AxisFault {
msgCtx.getTransportOut().getSender().cleanup(msgCtx);
}
/**
* We need to make a new SOAPEnvelope instance out of the original in
MessageContext,
* and this new instance is in essence using a new
ByteArrayInputStream; This way the
* original stream can then be safely closed when HttpConnection is
recollected in a
* clean-up process, otherwise the Axiom deferred-parsing will break.
This workaround
* may induce some unnecessary performance drawback.
*
* @param msgCtx
* @return
* @throws UnsupportedEncodingException
* @throws XMLStreamException
*/
private SOAPEnvelope getResponse(MessageContext msgCtx)
throws UnsupportedEncodingException, XMLStreamException
{
String charset = getCharset(msgCtx);
SOAPEnvelope response = msgCtx.getEnvelope();
InputStream is = new ByteArrayInputStream(response
.toStringWithConsume().getBytes(charset));
StAXBuilder newBuilder = BuilderUtil.getSOAPBuilder(is,
charset);
return (SOAPEnvelope) newBuilder.getDocumentElement();
}
}
> CLOSE_WAIT slowly building up over the period of time.
> ------------------------------------------------------
>
> Key: AXIS2-2883
> URL: https://issues.apache.org/jira/browse/AXIS2-2883
> Project: Axis2
> Issue Type: Bug
> Components: client-api
> Affects Versions: 1.1
> Environment: Operating System : Solaris
> Axis2 Version : 1.1
> Application Server : weblogic 8.1 SP6
> Using with Cocoon and weblogic DSP
> Reporter: Lakshmanan Venkatachalam
> Assignee: Glen Daniels
> Priority: Critical
> Fix For: 1.5.1
>
>
> I am experiencing theconstant increase in close wait in the production
> environment over the period 7 days.
> We are using Synchronous webservices and we are calling two webservices 24
> times every day. We have allocated the maximum of 1.5 GB per application
> instance and we have two application instances. We are utilizing maximum of
> 250 - 300 MB in average. So Full GC never runs in our environment.
> It seems like the client API ServiceClient.java is not cleaning up the
> resources associated with this component. We are creating the new
> ServiceClient component on every call we have for webservices. Though we have
> called the cleanup() method at the end of every call to the webservices. At
> times its not getting executed.
> But when we force garabage collection from the application, it was able to
> clear all the CLOSE_WAIT components. Since we have similar cleanup() call on
> finalize() method, it is able to do proper clean up when GC is collecting
> these objects.
> Forcing GC cannot be a solution, I like to hear from axis2 experts on how we
> can resolve this problem properly and what could be the cause for this
> happening.
> Below is our client code for your reference.
> private WebServiceResponse invokeWebservice(OMElement inputElement,
> Options options) throws WebServiceInvokerException {
> ServiceClient serviceClient = null;
> try {
> serviceClient = new ServiceClient();
> serviceClient.setOptions(options);
> // This following line of code is used when we are using
> // WS-Addressing. User has to make sure the addressing
> MAR file in
> // class path before enable the following line of code
> //
> // serviceClient.engageModule(new QName(
> // org.apache.axis2.Constants.MODULE_ADDRESSING));
> // Invoking synchrounous webservice
> //
> OMElement result =
> serviceClient.sendReceive(inputElement);
>
> OMNode firstOMChild = result.getFirstOMChild();
> // Conver the OMelements to XML String
> //
> Writer stringWriter = new StringWriter();
> firstOMChild.serialize(stringWriter);
> serviceClient.cleanup();
> stringWriter.flush();
> // Return the Axis2WebserviceResponse
> //
> return new
> Axis2WebServiceResponse(stringWriter.toString());
> } catch (AxisFault afe) {
> throw new WebServiceInvokerException(afe);
> } catch (XMLStreamException xse) {
> throw new WebServiceInvokerException(xse);
> } catch (IOException ioe) {
> throw new WebServiceInvokerException(ioe);
> } finally {
> try {
> serviceClient.cleanup();
> serviceClient=null;
> } catch (AxisFault axisFault) {
> //
> }
> }
> }
> }
> options are:
> Options options = new Options();
> options.setTo(targetEPR);
> options.setUseSeparateListener(false);
> options.setAction(wsRequest.getAction());
> options.setTimeOutInMilliSeconds(600000);
> options.setTransportInProtocol("http");
>
> options.setProperty(org.apache.axis2.context.MessageContextConstants.CHUNKED,
> org.apache.axis2.transport.http.HTTPConstants.HEADER_TRANSFER_ENCODING);
>
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]