You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2016/11/25 14:52:57 UTC

cxf git commit: [CXF-7135] Updating JAX-RS code to wait until the exchange completes when JMS is used, with thanks to Dan Kulp

Repository: cxf
Updated Branches:
  refs/heads/3.0.x-fixes 33e428428 -> 062eea9c6


[CXF-7135] Updating JAX-RS code to wait until the exchange completes when JMS is used, with thanks to Dan Kulp


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/062eea9c
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/062eea9c
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/062eea9c

Branch: refs/heads/3.0.x-fixes
Commit: 062eea9c61f9da913fd628b7ffe0984a435b8005
Parents: 33e4284
Author: Sergey Beryozkin <sb...@gmail.com>
Authored: Fri Nov 25 14:52:40 2016 +0000
Committer: Sergey Beryozkin <sb...@gmail.com>
Committed: Fri Nov 25 14:52:40 2016 +0000

----------------------------------------------------------------------
 .../apache/cxf/jaxrs/client/AbstractClient.java | 35 ++++++++++++++++++++
 1 file changed, 35 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/062eea9c/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
----------------------------------------------------------------------
diff --git a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
index b162fc7..d37de1c 100644
--- a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
+++ b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
@@ -121,6 +121,7 @@ public abstract class AbstractClient implements Client {
     private AtomicBoolean closed = new AtomicBoolean(); 
     protected AbstractClient(ClientState initialState) {
         this.state = initialState;
+        cfg.getInInterceptors().add(new InChainCompleteResponseInterceptor());
     }
     
     /**
@@ -555,6 +556,18 @@ public abstract class AbstractClient implements Client {
         Exchange exchange = message.getExchange(); 
       
         Exception ex = message.getContent(Exception.class);
+        if (ex == null) {
+            ex = message.getExchange().get(Exception.class);
+        }
+        if (ex == null && !exchange.isOneWay()) {
+            synchronized (exchange) {
+                while (exchange.get("IN_CHAIN_COMPLETE") == null) {
+                    exchange.wait(cfg.getSynchronousTimeout());
+                }
+            }
+        }
+        ex = message.getContent(Exception.class);
+        
         if (ex != null
             || PropertyUtils.isTrue(exchange.get(SERVICE_NOT_AVAIL_PROPERTY))
                 && PropertyUtils.isTrue(exchange.get(COMPLETE_IF_SERVICE_NOT_AVAIL_PROPERTY))) {
@@ -1135,4 +1148,26 @@ public abstract class AbstractClient implements Client {
             
         }
     }
+    protected static class InChainCompleteResponseInterceptor extends AbstractPhaseInterceptor<Message> {
+        InChainCompleteResponseInterceptor() {
+            super(Phase.UNMARSHAL);
+        }
+
+        @Override
+        public void handleMessage(Message message) throws Fault {
+            synchronized (message.getExchange()) {
+                message.getExchange().put("IN_CHAIN_COMPLETE", Boolean.TRUE);
+                message.getExchange().notifyAll();
+            }
+        }
+
+        @Override
+        public void handleFault(Message message) {
+            synchronized (message.getExchange()) {
+                message.getExchange().put("IN_CHAIN_COMPLETE", Boolean.TRUE);
+                message.getExchange().notifyAll();
+            }
+        }
+
+    }
 }