cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dhawalpatel (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CXF-6940) Bus Reference nullified pre-maturely in ClientImpl causing Exceptions while processing Responses
Date Wed, 15 Jun 2016 03:59:09 GMT

    [ https://issues.apache.org/jira/browse/CXF-6940?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15331101#comment-15331101
] 

Dhawalpatel commented on CXF-6940:
----------------------------------

[~dkulp] Hi Daniel, it would be good if you can comment on this defect as the code was changed
by you that introduced this bug. Thanks!

> 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
>            Priority: Critical
>
> 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)

Mime
View raw message