You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ff...@apache.org on 2011/02/21 09:39:47 UTC
svn commit: r1072880 -
/servicemix/components/trunk/engines/servicemix-cxf-se/src/main/java/org/apache/servicemix/cxfse/CxfSeProxyFactoryBean.java
Author: ffang
Date: Mon Feb 21 08:39:46 2011
New Revision: 1072880
URL: http://svn.apache.org/viewvc?rev=1072880&view=rev
Log:
[SMXCOMP-855]MessageExchange Leak in CXF SE Proxy Per-Request
Modified:
servicemix/components/trunk/engines/servicemix-cxf-se/src/main/java/org/apache/servicemix/cxfse/CxfSeProxyFactoryBean.java
Modified: servicemix/components/trunk/engines/servicemix-cxf-se/src/main/java/org/apache/servicemix/cxfse/CxfSeProxyFactoryBean.java
URL: http://svn.apache.org/viewvc/servicemix/components/trunk/engines/servicemix-cxf-se/src/main/java/org/apache/servicemix/cxfse/CxfSeProxyFactoryBean.java?rev=1072880&r1=1072879&r2=1072880&view=diff
==============================================================================
--- servicemix/components/trunk/engines/servicemix-cxf-se/src/main/java/org/apache/servicemix/cxfse/CxfSeProxyFactoryBean.java (original)
+++ servicemix/components/trunk/engines/servicemix-cxf-se/src/main/java/org/apache/servicemix/cxfse/CxfSeProxyFactoryBean.java Mon Feb 21 08:39:46 2011
@@ -27,10 +27,14 @@ import javax.xml.namespace.QName;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.bus.spring.SpringBusFactory;
+import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.ConduitInitiatorManager;
import org.apache.cxf.transport.jbi.JBITransportFactory;
import org.apache.servicemix.cxfse.interceptors.AttachmentInInterceptor;
@@ -90,6 +94,8 @@ public class CxfSeProxyFactoryBean imple
private Object componentRegistry;
+ private boolean clearClientResponseContext = true;
+
public Object getObject() throws Exception {
if (proxy == null) {
proxy = createProxy();
@@ -140,6 +146,12 @@ public class CxfSeProxyFactoryBean imple
ClientProxy.getClient(proxy).getEndpoint()
.getBinding().getOutInterceptors().add(new AttachmentOutInterceptor());
}
+ if (isClearClientResponseContext()) {
+ ClearClientResponseContextInterceptor clearClientResponseContextInterceptor = new ClearClientResponseContextInterceptor(ClientProxy.getClient(proxy));
+ ClientProxy.getClient(proxy).getEndpoint().getBinding().getOutInterceptors().add(clearClientResponseContextInterceptor);
+ ClientProxy.getClient(proxy).getEndpoint().getBinding().getOutFaultInterceptors().add(clearClientResponseContextInterceptor);
+ }
+
return proxy;
}
@@ -385,4 +397,38 @@ public class CxfSeProxyFactoryBean imple
return componentRegistry;
}
+ /**
+ * Specifies if the CXF client response context is cleared after each proxy invocation. Set to true if
+ * caller wishes to use CXF client call to getResponseContext() to obtain response values directly, such
+ * as the message exchange for the invocation.
+ *
+ * @org.apache.xbean.Property description=
+ * "Specifies if the CXF client response context is cleared after each proxy invocation. The default is
+ * <code>true</code>."
+ */
+ public void setClearClientResponseContext(boolean clearClientResponseContext) {
+ this.clearClientResponseContext = clearClientResponseContext;
+ }
+
+ public boolean isClearClientResponseContext() {
+ return clearClientResponseContext;
+ }
+
+ public static class ClearClientResponseContextInterceptor extends AbstractPhaseInterceptor<Message> {
+ private final Client client;
+
+ public ClearClientResponseContextInterceptor(Client client) {
+ super(Phase.POST_LOGICAL_ENDING);
+ this.client = client;
+ }
+
+ public void handleMessage(Message message) throws Fault {
+ client.getResponseContext().clear();
+ }
+
+ public void handleFault(Message message) {
+ client.getResponseContext().clear();
+ }
+ }
+
}