You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ge...@apache.org on 2009/05/27 11:38:46 UTC

svn commit: r779073 - in /servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src: main/java/org/apache/servicemix/camel/ test/java/org/apache/servicemix/camel/

Author: gertv
Date: Wed May 27 09:38:46 2009
New Revision: 779073

URL: http://svn.apache.org/viewvc?rev=779073&view=rev
Log:
SMXCOMP-495: Allow Camel Exchange to outlive the underlying JBI MessageExchange

Removed:
    servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiProducerTest.java.rej
Modified:
    servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/CamelProviderEndpoint.java
    servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/JbiExchange.java
    servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiExchangeTest.java
    servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOnlyTest.java
    servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOptionalOutCamelTest.java

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/CamelProviderEndpoint.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/CamelProviderEndpoint.java?rev=779073&r1=779072&r2=779073&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/CamelProviderEndpoint.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/CamelProviderEndpoint.java Wed May 27 09:38:46 2009
@@ -20,6 +20,7 @@
 import javax.jbi.messaging.ExchangeStatus;
 import javax.jbi.messaging.InOnly;
 import javax.jbi.messaging.MessageExchange;
+import javax.jbi.messaging.MessagingException;
 import javax.jbi.messaging.RobustInOnly;
 import javax.xml.namespace.QName;
 
@@ -103,9 +104,9 @@
                     } else {
                         e = new Exception(t);
                     }
-                    fail(exchange, e);
+                    fail(camelExchange, e);
                 } else {
-                    done(exchange);
+                    done(camelExchange);
                 }
             } else {
                 if (logger.isDebugEnabled()) {
@@ -125,13 +126,13 @@
                     } else {
                         e = new Exception(t);
                     }
-                    fail(exchange, e);
+                    fail(camelExchange, e);
                 } else {
                     boolean txSync = exchange.isTransacted() && Boolean.TRUE.equals(exchange.getProperty(JbiConstants.SEND_SYNC));
                     if (txSync) {
-                        sendSync(exchange);
+                        sendSync(camelExchange);
                     } else {
-                        send(exchange);
+                        send(camelExchange);
                     }
                 }
             }
@@ -141,4 +142,31 @@
         }
     }
 
+    /*
+     * Send the underlying JBI MessageExchange and detach it from the Camel JbiExchange
+     */
+    private void send(JbiExchange camelExchange) throws MessagingException {
+        send(camelExchange.detach());
+    }
+
+    /*
+     * Synchronously send the underlying JBI MessageExchange and detach it from the Camel JbiExchange
+     */
+    private void sendSync(JbiExchange camelExchange) throws MessagingException {
+        sendSync(camelExchange.detach());
+    }
+
+    /*
+     * Send a DONE status for the underlying JBI MessageExchange and detach it from the Camel JbiExchange
+     */
+    private void done(JbiExchange camelExchange) throws MessagingException {
+        done(camelExchange.detach());
+    }
+
+    /*
+     * Make the underlying JBI MessageExchange fail and detach it from the Camel JbiExchange
+     */
+    private void fail(JbiExchange camelExchange, Exception e) throws MessagingException {
+        fail(camelExchange.detach(), e);
+    }
 }

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/JbiExchange.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/JbiExchange.java?rev=779073&r1=779072&r2=779073&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/JbiExchange.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/main/java/org/apache/servicemix/camel/JbiExchange.java Wed May 27 09:38:46 2009
@@ -45,13 +45,10 @@
         populateProperties();
     }
 
-
-
     public JbiExchange(CamelContext context, JbiBinding binding, MessageExchange messageExchange) {
         super(context);
         this.binding = binding;
         this.messageExchange = messageExchange;
-
         setPattern(ExchangePattern.fromWsdlUri(messageExchange.getPattern().toString()));
         populateProperties();
     }
@@ -82,8 +79,12 @@
     }
 
     @Override
-    public org.apache.camel.Exchange newInstance() {        
-        return new JbiExchange(this.getContext(), this.getBinding(), this.getMessageExchange());
+    public org.apache.camel.Exchange newInstance() {    
+        if (messageExchange == null) {
+            return new JbiExchange(this.getContext(), this.getBinding());
+        } else {
+            return new JbiExchange(this.getContext(), this.getBinding(), this.getMessageExchange());
+        }
     }
     
     @Override
@@ -198,4 +199,11 @@
         }
     }
 
+    public MessageExchange detach() {
+        try {
+            return messageExchange;
+        } finally {
+            messageExchange = null;
+        }
+    }
 }

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiExchangeTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiExchangeTest.java?rev=779073&r1=779072&r2=779073&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiExchangeTest.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiExchangeTest.java Wed May 27 09:38:46 2009
@@ -26,6 +26,7 @@
 
 import org.apache.camel.Exchange;
 import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.servicemix.jbi.jaxp.StringSource;
 import org.apache.servicemix.jbi.messaging.FaultImpl;
 import org.apache.servicemix.jbi.messaging.MessageExchangeSupport;
 import org.apache.servicemix.tck.mock.MockMessageExchange;
@@ -87,6 +88,22 @@
         assertSame(fault, exchange.getFaultMessage());
     }
     
+    public void testDetach() throws Exception {
+        MessageExchange exchange = createMockExchange();
+        StringSource body = new StringSource("<question>Will this still be there?</question>");
+        exchange.setMessage(exchange.createMessage(), "in");
+        exchange.getMessage("in").setContent(body);
+        exchange.getMessage("in").setProperty("key", "value");
+        JbiExchange camelExchange = new JbiExchange(new DefaultCamelContext(), new JbiBinding(), exchange);
+        assertEquals(body, camelExchange.getIn().getBody());
+        // now detach the Camel Exchange from the underlying JBI MessageExchange
+        assertSame(exchange, camelExchange.detach());
+        assertNull(camelExchange.getMessageExchange());
+        // and make sure that all the data is still there
+        assertEquals(body, camelExchange.getIn().getBody());
+        assertEquals("value", camelExchange.getIn().getHeader("key"));
+    }
+    
     private MessageExchange createMockExchange() {
         return new MockMessageExchange() {
             @Override

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOnlyTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOnlyTest.java?rev=779073&r1=779072&r2=779073&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOnlyTest.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOnlyTest.java Wed May 27 09:38:46 2009
@@ -18,6 +18,7 @@
 
 import java.util.List;
 
+import javax.jbi.messaging.ExchangeStatus;
 import javax.jbi.messaging.InOnly;
 import javax.xml.namespace.QName;
 
@@ -44,6 +45,20 @@
         exchange.setService(new QName("urn:test", "in-only"));
         exchange.getInMessage().setContent(new StringSource(MESSAGE));
         client.send(exchange);
+        client.receive(1000);
+        assertEquals(ExchangeStatus.DONE, exchange.getStatus());
+        done.assertIsSatisfied();
+    }
+    
+    public void testInOnlyExchangeForwardAndConvertBody() throws Exception {
+        MockEndpoint done = getMockEndpoint("mock:done");
+        done.expectedBodiesReceived(MESSAGE);
+        
+        ServiceMixClient client = new DefaultServiceMixClient(jbiContainer);
+        InOnly exchange = client.createInOnlyExchange();
+        exchange.setService(new QName("urn:test", "forward"));
+        exchange.getInMessage().setContent(new StringSource(MESSAGE));
+        client.sendSync(exchange);
         
         done.assertIsSatisfied();
     }
@@ -52,6 +67,19 @@
     protected void appendJbiActivationSpecs(List<ActivationSpec> activationSpecList) {
         // no additional activation specs required
     }
+    
+    public void testInOnlyToAggregator() throws Exception {
+        ServiceMixClient smxClient = getServicemixClient();
+        getMockEndpoint("mock:aggregated").expectedMessageCount(1);
+        for (int i = 0; i < 50; i++) {
+            InOnly exchange = smxClient.createInOnlyExchange();
+            exchange.setService(new QName("urn:test", "in-only-aggregator"));
+            exchange.getInMessage().setProperty("key", "aggregate-this");
+            exchange.getInMessage().setContent(new StringSource("<request>Could you please aggregate this?</request>"));
+            smxClient.send(exchange);
+        }
+        getMockEndpoint("mock:aggregated").assertIsSatisfied();
+    }
 
     @Override
     protected RouteBuilder createRoutes() {
@@ -59,7 +87,12 @@
 
             @Override
             public void configure() throws Exception {
+                from("jbi:service:urn:test:forward").to("jbi:service:urn:test:in-only?mep=in-only");
                 from("jbi:service:urn:test:in-only").convertBodyTo(String.class).to("mock:done");
+                from("jbi:service:urn:test:in-only-aggregator")
+                    .aggregator(header("key"))
+                    .setHeader("aggregated").constant(true)
+                    .to("mock:aggregated");
             }
             
         };

Modified: servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOptionalOutCamelTest.java
URL: http://svn.apache.org/viewvc/servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOptionalOutCamelTest.java?rev=779073&r1=779072&r2=779073&view=diff
==============================================================================
--- servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOptionalOutCamelTest.java (original)
+++ servicemix/smx3/branches/servicemix-3.2/deployables/serviceengines/servicemix-camel/src/test/java/org/apache/servicemix/camel/JbiInOptionalOutCamelTest.java Wed May 27 09:38:46 2009
@@ -39,6 +39,8 @@
         client.sendBody("direct:in-optional-out", new StringSource("<request>Does this MEP confuse you?</request>"));
         
         inonly.assertIsSatisfied();
+        // let's wait for a moment to ensure that all pending Exchanges are handled
+        Thread.sleep(500);
     }
     
     public void testInOptionalOutFromJbiWithDone() throws Exception {