[ 
https://issues.apache.org/jira/browse/CXF-6940?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Daniel Kulp resolved CXF-6940.
------------------------------
       Resolution: Resolved
         Assignee: Daniel Kulp
    Fix Version/s: Invalid

Updated the docs

> Bus Reference nullified pre-maturely in ClientImpl causing Exceptions while 
> processing Responses
> ------------------------------------------------------------------------------------------------
>
>                 Key: CXF-6940
>                 URL: https://issues.apache.org/jira/browse/CXF-6940
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-WS Runtime
>    Affects Versions: 3.1.4
>         Environment: IBM JDK 1.7, Apache CXF installed as resource Adapter on 
> IBM WebSphere 8.5.5.3 on RHEL 6.0
>            Reporter: Dhawalpatel
>            Assignee: Daniel Kulp
>            Priority: Critical
>             Fix For: Invalid
>
>
> Hi Daniel,
> Test Scenario:
> Install CXF as Resource Adapter in J2EE Container and use below code to call 
> a JAX-WS API.
> /* Lookup Resource Adapter of JCA and get COnnection*/
> CXFConnectionFactory connectionFactory = getCXFConnectionFactory(portClass);
>    CXFConnectionSpec connectionSpec = createCXFConnectionSpec(portClass, 
> serviceName, portName, webServiceDefinition);
> /* Get the Port from JCA Connection pool*/
>   connection = connectionFactory.getConnection(connectionSpec);
>        port = connection.getService(portClass);
> /* Close the JCA Connection*/
> if(connection != null)
>  connection.close();
> /*WebService call*/
> port.getAccount();
> Description: 
> When a JCA Connection pool eviction happens due to Max Connections reached 
> state, the existing on-going outgoing JAX-WS Calls errors out with below 
> exception:
> Message received on a Client that has been closed or destroyed.
>       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
>       at 
> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:86)
>       at 
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:58)
>       at java.lang.reflect.Constructor.newInstance(Constructor.java:542)
>       at 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1376)
>       at 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1365)
>       at 
> org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:56)
>       at 
> org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:215)
>       at 
> org.apache.cxf.io.AbstractWrappedOutputStream.close(AbstractWrappedOutputStream.java:77)
>       at 
> org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
>       at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:651)
>       at 
> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
>       at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
>       at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:520)
>       at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:429)
>       at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:330)
>       at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:283)
>       at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
>       at 
> org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:139)
>       at com.sun.proxy.$Proxy106.inquireWirelinePaymentPlan(Unknown Source)
>       at sun.reflect.GeneratedMethodAccessor360.invoke(Unknown Source)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56)
>       at java.lang.reflect.Method.invoke(Method.java:620)
>       at AppAdapter.executeWebService(AppAdapter.java:702)
>       
> Caused by: 
> java.lang.IllegalStateException: Message received on a Client that has been 
> closed or destroyed.
>       at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:707)
>       at 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1669)
>       at 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1550)
>       at 
> org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1347)
>       ... 26 more
> On further investigation, it seems you changed the code in ClientImpl.java as 
> per https://issues.apache.org/jira/browse/CXF-3765 and change log
> https://fisheye6.atlassian.com/changelog/cxf?cs=e0ef66391d2e7e62e63e96214eca95e292271892
> by adding the additional cleanup code in ClientImpl.java the below lines
> bus = null;
>         conduitSelector = null;
>         outFaultObserver = null;
>         outboundChainCache = null;
>         inboundChainCache = null;
>         currentRequestContext = null;
>         requestContext.clear();
>         requestContext = null;
>         responseContext.clear();
>         responseContext = null;
>         executor = null;   
> The above lines added by you for cleanup has broken the behavior of using the 
> JCA connection for getting port and closing it immediately and then using the 
> port to call the webservice. This leads to above exception when JCA Pool 
> maxes out causing an eviction on JCA Pool by below thread stack causing the 
> ClientImpl's destroy to be called and ultimately the bus obj ref getting set 
> to null by your code and ultimately this exception.
> The behavior in CXF 2.3 was perfectly fine with no such problems. This was 
> introduced by above mentioned code fix.
> org.apache.cxf.endpoint.ClientImpl.destroy(ClientImpl.java:152)
> org.apache.cxf.jca.outbound.ManagedConnectionImpl.destroy(ManagedConnectionImpl.java:121)
> com.ibm.ejs.j2c.MCWrapper.destroy(MCWrapper.java:2086)
> com.ibm.ejs.j2c.FreePool.cleanupAndDestroyMCWrapper(FreePool.java:775)
> com.ibm.ejs.j2c.PoolManager.claimVictim(PoolManager.java:5190)
> com.ibm.ejs.j2c.PoolManager.reserve(PoolManager.java:3657)
> com.ibm.ejs.j2c.PoolManager.reserve(PoolManager.java:3091)
> com.ibm.ejs.j2c.ConnectionManager.allocateMCWrapper(ConnectionManager.java:1548)
> com.ibm.ejs.j2c.ConnectionManager.allocateConnection(ConnectionManager.java:1031)
> org.apache.cxf.jca.outbound.ConnectionFactoryImpl.getConnection(ConnectionFactoryImpl.java:53)
> com.sbc.cc.clarify.api.util.cxf.XCxfConnectorWebServiceInitializer.getCxfPortImpl(XCxfConnectorWebServiceInitializer.java:217)
> Please fix this behavior since its not in the alignment to the behavior 
> mentioned in JCA Spec and as per the documentation provided in CXF as well.
> Thanks



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to