This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot-examples.git


The following commit(s) were added to refs/heads/master by this push:
     new 3822b68  splitter-eip-example
3822b68 is described below

commit 3822b6864b66f2467ce5e3de94eca2f7351528ee
Author: Farid Guliyev <[email protected]>
AuthorDate: Fri Oct 30 10:03:34 2020 -0400

    splitter-eip-example
---
 README.adoc                                        |   4 +-
 camel-example-spring-boot-splitter-eip/README.adoc |  25 ++
 camel-example-spring-boot-splitter-eip/pom.xml     | 149 ++++++++
 .../spring/boot/AggregationStrategyPojo.java       |  30 ++
 .../camel/example/spring/boot/Application.java     |  34 ++
 .../example/spring/boot/MyMessageTransformer.java  |  40 ++
 .../camel/example/spring/boot/SplitterRouter.java  | 107 ++++++
 .../src/main/resources/application.properties      |  30 ++
 .../src/test/java/CamelSplitterEIPTests.java       | 136 +++++++
 pom.xml                                            | 424 +++++++++++----------
 10 files changed, 767 insertions(+), 212 deletions(-)

diff --git a/README.adoc b/README.adoc
index cb49d8a..f3cc342 100644
--- a/README.adoc
+++ b/README.adoc
@@ -27,7 +27,7 @@ readme's instructions.
 == Examples
 
 // examples: START
-Number of Examples: 47 (0 deprecated)
+Number of Examples: 48 (0 deprecated)
 
 [width="100%",cols="4,2,4",options="header"]
 |===
@@ -51,6 +51,8 @@ Number of Examples: 47 (0 deprecated)
 
 | link:camel-example-spring-boot-rest-swagger-simple/README.adoc[REST Swagger] 
(camel-example-spring-boot-rest-swagger-simple) | Beginner | This example shows 
how to call a Rest service defined using Swagger specification
 
+| link:camel-example-spring-boot-splitter-eip/README.adoc[Spring Boot Splitter 
Eip] (camel-example-spring-boot-splitter-eip) | Beginner | An example showing 
Splitter EIP with Camel and Spring Boot
+
 | link:camel-example-spring-boot-type-converter/README.adoc[Spring Boot Type 
Converter] (camel-example-spring-boot-type-converter) | Beginner | An example 
showing how to create custom type converter with Camel and Spring Boot
 
 | link:camel-example-spring-boot-unit-testing/README.adoc[Spring Boot Unit 
Testing] (camel-example-spring-boot-unit-testing) | Beginner | An example 
showing how to write unit tests with Camel and Spring Boot
diff --git a/camel-example-spring-boot-splitter-eip/README.adoc 
b/camel-example-spring-boot-splitter-eip/README.adoc
new file mode 100644
index 0000000..e050011
--- /dev/null
+++ b/camel-example-spring-boot-splitter-eip/README.adoc
@@ -0,0 +1,25 @@
+== Spring Boot and ServiceCall EIP Example
+
+This example show how to use Camel with Splitter EIP with Spring Boot.
+
+Examples
+
+ - Example 1 : Simple splitter.
+ - Example 2 : Splitter with subsequent aggregation.
+ - Example 3 : Splitter with subsequent aggregation using POJO bean instead of 
AggregationStrategy implementation
+ - Example 4 : Splitter with subsequent aggregation failing on exception.
+ - Example 5: Splitter with subsequent aggregation on failing on aggregation 
exception.
+
+=== How to run
+
+    mvn clean test
+     
+=== Help and contributions
+
+If you hit any problem using Camel or have some feedback, then please
+https://camel.apache.org/support.html[let us know].
+
+We also love contributors, so
+https://camel.apache.org/contributing.html[get involved] :-)
+
+The Camel riders!
diff --git a/camel-example-spring-boot-splitter-eip/pom.xml 
b/camel-example-spring-boot-splitter-eip/pom.xml
new file mode 100644
index 0000000..d30f548
--- /dev/null
+++ b/camel-example-spring-boot-splitter-eip/pom.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ /*
+  ~  * Licensed to the Apache Software Foundation (ASF) under one or more
+  ~  * contributor license agreements.  See the NOTICE file distributed with
+  ~  * this work for additional information regarding copyright ownership.
+  ~  * The ASF licenses this file to You under the Apache License, Version 2.0
+  ~  * (the "License"); you may not use this file except in compliance with
+  ~  * the License.  You may obtain a copy of the License at
+  ~  *
+  ~  *      http://www.apache.org/licenses/LICENSE-2.0
+  ~  *
+  ~  * Unless required by applicable law or agreed to in writing, software
+  ~  * distributed under the License is distributed on an "AS IS" BASIS,
+  ~  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~  * See the License for the specific language governing permissions and
+  ~  * limitations under the License.
+  ~  */
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+                xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+       <parent>
+               <artifactId>examples</artifactId>
+               <groupId>org.apache.camel.springboot.example</groupId>
+               <version>3.7.0-SNAPSHOT</version>
+       </parent>
+       <modelVersion>4.0.0</modelVersion>
+
+       <artifactId>camel-example-spring-boot-splitter-eip</artifactId>
+       <name>Camel SB Examples :: Camel Splitter EIP</name>
+       <description>An example showing Splitter EIP with Camel and Spring 
Boot</description>
+
+       <properties>
+               <category>Beginner</category>
+
+               
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+               
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+               
<spring.boot-version>${spring-boot-version}</spring.boot-version>
+       </properties>
+
+       <dependencyManagement>
+               <dependencies>
+                       <!-- Spring Boot BOM -->
+                       <dependency>
+                               <groupId>org.springframework.boot</groupId>
+                               
<artifactId>spring-boot-dependencies</artifactId>
+                               <version>${spring.boot-version}</version>
+                               <type>pom</type>
+                               <scope>import</scope>
+                       </dependency>
+                       <!-- Camel BOM -->
+                       <dependency>
+                               <groupId>org.apache.camel.springboot</groupId>
+                               <artifactId>camel-spring-boot-bom</artifactId>
+                               <version>${camel-version}</version>
+                               <type>pom</type>
+                               <scope>import</scope>
+                       </dependency>
+               </dependencies>
+       </dependencyManagement>
+
+       <dependencies>
+
+               <!-- Spring Boot -->
+               <dependency>
+                       <groupId>org.springframework.boot</groupId>
+                       <artifactId>spring-boot-starter</artifactId>
+               </dependency>
+               <!-- Camel -->
+               <dependency>
+                       <groupId>org.apache.camel.springboot</groupId>
+                       <artifactId>camel-spring-boot-starter</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.camel.springboot</groupId>
+                       <artifactId>camel-stream-starter</artifactId>
+               </dependency>
+
+               <!-- test -->
+               <dependency>
+                       <groupId>org.springframework.boot</groupId>
+                       <artifactId>spring-boot-starter-test</artifactId>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.camel</groupId>
+                       <artifactId>camel-test-spring-junit5</artifactId>
+                       <scope>test</scope>
+               </dependency>
+       </dependencies>
+
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.springframework.boot</groupId>
+                               
<artifactId>spring-boot-maven-plugin</artifactId>
+                               <version>${spring-boot-version}</version>
+                               <executions>
+                                       <execution>
+                                               <goals>
+                                                       <goal>repackage</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <!-- Camel Maven Package Plugin to generate Type 
Converter Loader source code - Camel 3.x way -->
+                       <plugin>
+                               <groupId>org.codehaus.mojo</groupId>
+                               
<artifactId>build-helper-maven-plugin</artifactId>
+                               <executions>
+                                       <execution>
+                                               <phase>initialize</phase>
+                                               <goals>
+                                                       <goal>add-source</goal>
+                                                       
<goal>add-resource</goal>
+                                               </goals>
+                                               <configuration>
+                                                       <sources>
+                                                               
<source>src/generated/java</source>
+                                                       </sources>
+                                                       <resources>
+                                                               <resource>
+                                                                       
<directory>src/generated/resources</directory>
+                                                               </resource>
+                                                       </resources>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <!-- Adds mgenerated Type Converter Loader source in 
src/generated to the source path - Camel 3.x way -->
+                       <plugin>
+                               <groupId>org.apache.camel</groupId>
+                               
<artifactId>camel-package-maven-plugin</artifactId>
+                               <version>${camel-version}</version>
+                               <executions>
+                                       <execution>
+                                               <id>generate</id>
+                                               <goals>
+                                                       
<goal>generate-component</goal>
+                                               </goals>
+                                               <phase>process-classes</phase>
+                                       </execution>
+                               </executions>
+                       </plugin>
+               </plugins>
+       </build>
+</project>
\ No newline at end of file
diff --git 
a/camel-example-spring-boot-splitter-eip/src/main/java/org/apache/camel/example/spring/boot/AggregationStrategyPojo.java
 
b/camel-example-spring-boot-splitter-eip/src/main/java/org/apache/camel/example/spring/boot/AggregationStrategyPojo.java
new file mode 100644
index 0000000..95922b0
--- /dev/null
+++ 
b/camel-example-spring-boot-splitter-eip/src/main/java/org/apache/camel/example/spring/boot/AggregationStrategyPojo.java
@@ -0,0 +1,30 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  * contributor license agreements.  See the NOTICE file distributed with
+ *  * this work for additional information regarding copyright ownership.
+ *  * The ASF licenses this file to You under the Apache License, Version 2.0
+ *  * (the "License"); you may not use this file except in compliance with
+ *  * the License.  You may obtain a copy of the License at
+ *  *
+ *  *      http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.
+ *
+ */
+package org.apache.camel.example.spring.boot;
+
+public class AggregationStrategyPojo {
+
+       public String aggregate(String oldBody, String newBody) {
+               if (newBody != null) {
+                       return oldBody + "+" + newBody;
+               } else {
+                       return oldBody;
+               }
+       }
+}
diff --git 
a/camel-example-spring-boot-splitter-eip/src/main/java/org/apache/camel/example/spring/boot/Application.java
 
b/camel-example-spring-boot-splitter-eip/src/main/java/org/apache/camel/example/spring/boot/Application.java
new file mode 100644
index 0000000..ecfefd9
--- /dev/null
+++ 
b/camel-example-spring-boot-splitter-eip/src/main/java/org/apache/camel/example/spring/boot/Application.java
@@ -0,0 +1,34 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  * contributor license agreements.  See the NOTICE file distributed with
+ *  * this work for additional information regarding copyright ownership.
+ *  * The ASF licenses this file to You under the Apache License, Version 2.0
+ *  * (the "License"); you may not use this file except in compliance with
+ *  * the License.  You may obtain a copy of the License at
+ *  *
+ *  *      http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.
+ *
+ */
+package org.apache.camel.example.spring.boot;
+
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+
+@SpringBootApplication
+public class Application {
+
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+
+}
+
diff --git 
a/camel-example-spring-boot-splitter-eip/src/main/java/org/apache/camel/example/spring/boot/MyMessageTransformer.java
 
b/camel-example-spring-boot-splitter-eip/src/main/java/org/apache/camel/example/spring/boot/MyMessageTransformer.java
new file mode 100644
index 0000000..8ca6986
--- /dev/null
+++ 
b/camel-example-spring-boot-splitter-eip/src/main/java/org/apache/camel/example/spring/boot/MyMessageTransformer.java
@@ -0,0 +1,40 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  * contributor license agreements.  See the NOTICE file distributed with
+ *  * this work for additional information regarding copyright ownership.
+ *  * The ASF licenses this file to You under the Apache License, Version 2.0
+ *  * (the "License"); you may not use this file except in compliance with
+ *  * the License.  You may obtain a copy of the License at
+ *  *
+ *  *      http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.
+ *
+ */
+package org.apache.camel.example.spring.boot;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class MyMessageTransformer {
+
+       private final Map<String, String> messagesDictionary = new HashMap<>();
+
+       public MyMessageTransformer() {
+               messagesDictionary.put("A", "Alpha");
+               messagesDictionary.put("B", "Beta");
+               messagesDictionary.put("C", "Charlie");
+       }
+
+       public String transform(String key){
+               if (!messagesDictionary.containsKey(key)){
+                       throw new IllegalArgumentException("Unknown key " + 
key);
+               }
+               return messagesDictionary.get(key);
+       }
+}
diff --git 
a/camel-example-spring-boot-splitter-eip/src/main/java/org/apache/camel/example/spring/boot/SplitterRouter.java
 
b/camel-example-spring-boot-splitter-eip/src/main/java/org/apache/camel/example/spring/boot/SplitterRouter.java
new file mode 100644
index 0000000..eb03995
--- /dev/null
+++ 
b/camel-example-spring-boot-splitter-eip/src/main/java/org/apache/camel/example/spring/boot/SplitterRouter.java
@@ -0,0 +1,107 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  * contributor license agreements.  See the NOTICE file distributed with
+ *  * this work for additional information regarding copyright ownership.
+ *  * The ASF licenses this file to You under the Apache License, Version 2.0
+ *  * (the "License"); you may not use this file except in compliance with
+ *  * the License.  You may obtain a copy of the License at
+ *  *
+ *  *      http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.
+ *
+ */
+
+package org.apache.camel.example.spring.boot;
+
+import org.apache.camel.builder.AggregationStrategies;
+import org.apache.camel.builder.RouteBuilder;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class SplitterRouter extends RouteBuilder {
+       @Override
+       public void configure() throws Exception {
+
+               // @formatter:off
+               // Example 1 : Simple splitter
+               from("direct:splitter")
+                               // body is of type java.lang.Iterable, 
java.lang.String or Array
+                               .split(body())
+                               .to("mock:a");
+
+               // Example 2 : Splitter with subsequent aggregation
+               from("direct:split-aggregate")
+                                       .split(body(), ((oldExchange, 
newExchange) -> {
+                                               if (oldExchange == null) {
+                                                       // this is the first 
time so no existing aggregated exchange
+                                                       return newExchange;
+                                               }
+
+                                               String body = 
newExchange.getIn().getBody(String.class);
+                                               String existing = 
oldExchange.getIn().getBody(String.class);
+
+                                               
oldExchange.getIn().setBody(existing + "+" + body);
+                                               return oldExchange;
+                                       }))
+                               // Transform after aggregation
+                               .bean(MyMessageTransformer.class)
+                               .to("mock:b")
+                               .end()
+                       .to("mock:c");
+
+               // Example 3 : Splitter with subsequent aggregation using POJO 
bean instead of AggregationStrategy implementation
+               from("direct:split-aggregate-bean")
+                               // Aggregation with POJO, no tight coupling to 
Camel API - better for unit testing
+                                       .split(body(), 
AggregationStrategies.bean(AggregationStrategyPojo.class))
+                                       // Transformation after aggregation
+                                       .bean(MyMessageTransformer.class)
+                                       .to("mock:d")
+                               .end()
+                       .to("mock:e");
+
+               // Example 4 : Splitter with subsequent aggregation failing on 
exception
+               from("direct:split-aggregate-stop-on-exception")
+                               .split(body(), 
AggregationStrategies.bean(AggregationStrategyPojo.class))
+                                               // stop processing if exception 
occured durring process of splitting
+                                               .stopOnException()
+                                               
.bean(MyMessageTransformer.class)
+                                       .to("mock:f")
+                               .end()
+                       .to("mock:g");
+
+               // Example 5: Splitter with subsequent aggregation on failing 
on aggregation exception
+               from("direct:split-aggregate-stop-on-aggregation-exception")
+                               // Continuing route processing on exception
+                               
.onException(IllegalArgumentException.class).continued(true).end()
+                               .split(body(), ((oldExchange, newExchange) -> {
+                                               if (oldExchange == null) {
+                                                       // this is the first 
time so no existing aggregated exchange
+                                                       return newExchange;
+                                               }
+
+                                               String body = 
newExchange.getIn().getBody(String.class);
+                                               String existing = 
oldExchange.getIn().getBody(String.class);
+                                               if (body.equals("E")){
+                                                       throw new 
IllegalArgumentException("Error occurred during aggregation");
+                                               }
+                                               
oldExchange.getIn().setBody(existing + "+" + body);
+                                               return oldExchange;
+                                       }))
+                                       // stop processing if exception occurs 
during aggregation
+                                       .stopOnAggregateException(true)
+//                                     .bean(MyMessageTransformer.class)
+                               .to("mock:h")
+                               .end()
+                       .to("mock:j");
+               // @formatter:on
+
+       }
+}
+
diff --git 
a/camel-example-spring-boot-splitter-eip/src/main/resources/application.properties
 
b/camel-example-spring-boot-splitter-eip/src/main/resources/application.properties
new file mode 100644
index 0000000..def0862
--- /dev/null
+++ 
b/camel-example-spring-boot-splitter-eip/src/main/resources/application.properties
@@ -0,0 +1,30 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+# the name of Camel
+camel.springboot.name = CamelSpringBootSplitter
+
+# required for generated Type Converter Loader - Camel 3.x way
+camel.springboot.load-type-converters=true
+
+# to configure logging levels
+logging.level.org.springframework = INFO
+logging.level.org.apache.camel.spring.boot = INFO
+logging.level.org.apache.camel.impl = INFO
+logging.level.org.apache.camel = INFO
+logging.level.sample.camel = INFO
+#logging.level.sample.camel = DEBUG
diff --git 
a/camel-example-spring-boot-splitter-eip/src/test/java/CamelSplitterEIPTests.java
 
b/camel-example-spring-boot-splitter-eip/src/test/java/CamelSplitterEIPTests.java
new file mode 100644
index 0000000..3566679
--- /dev/null
+++ 
b/camel-example-spring-boot-splitter-eip/src/test/java/CamelSplitterEIPTests.java
@@ -0,0 +1,136 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  * contributor license agreements.  See the NOTICE file distributed with
+ *  * this work for additional information regarding copyright ownership.
+ *  * The ASF licenses this file to You under the Apache License, Version 2.0
+ *  * (the "License"); you may not use this file except in compliance with
+ *  * the License.  You may obtain a copy of the License at
+ *  *
+ *  *      http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.
+ *
+ */
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelExchangeException;
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.example.spring.boot.Application;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.junit.jupiter.api.Test;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import static org.apache.camel.test.junit5.TestSupport.assertIsInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@CamelSpringBootTest
+@SpringBootTest(classes = {Application.class})
+public class CamelSplitterEIPTests {
+
+       @Autowired
+       private CamelContext camelContext;
+
+       @Autowired
+       private ProducerTemplate producerTemplate;
+
+       @Test
+       public void testSplit() throws InterruptedException {
+               MockEndpoint mockA = camelContext.getEndpoint("mock:a", 
MockEndpoint.class);
+
+               mockA.expectedBodiesReceived("A", "B", "C");
+
+               producerTemplate.sendBody("direct:splitter", new 
ArrayList<>(Arrays.asList("A", "B", "C")));
+
+               mockA.assertIsSatisfied();
+       }
+
+       @Test
+       public void testSplitAggregate() throws InterruptedException {
+               MockEndpoint mockB = camelContext.getEndpoint("mock:b", 
MockEndpoint.class);
+               MockEndpoint mockC = camelContext.getEndpoint("mock:c", 
MockEndpoint.class);
+
+               mockB.expectedBodiesReceived("Alpha", "Beta", "Charlie");
+               mockC.expectedBodiesReceived("Alpha+Beta+Charlie");
+
+               producerTemplate.sendBody("direct:split-aggregate", "A,B,C");
+
+               mockB.assertIsSatisfied();
+               mockC.assertIsSatisfied();
+       }
+
+       @Test
+       public void testSplitAggregatePojo() throws InterruptedException {
+               MockEndpoint mockD = camelContext.getEndpoint("mock:d", 
MockEndpoint.class);
+               MockEndpoint mockE = camelContext.getEndpoint("mock:e", 
MockEndpoint.class);
+
+               mockD.expectedBodiesReceived("Alpha", "Beta", "Charlie");
+               mockE.expectedBodiesReceived("Alpha+Beta+Charlie");
+
+               producerTemplate.sendBody("direct:split-aggregate-bean", 
"A,B,C");
+
+               mockD.assertIsSatisfied();
+               mockE.assertIsSatisfied();
+       }
+
+       @Test
+       public void testSplitAggregateStopOnException() throws 
InterruptedException {
+               MockEndpoint mockF = camelContext.getEndpoint("mock:f", 
MockEndpoint.class);
+               MockEndpoint mockG = camelContext.getEndpoint("mock:g", 
MockEndpoint.class);
+
+               mockF.expectedBodiesReceived("Alpha");
+               mockG.expectedMessageCount(0);
+
+               final CamelExecutionException ex = 
assertThrows(CamelExecutionException.class,
+                               () -> 
producerTemplate.sendBody("direct:split-aggregate-stop-on-exception", "A,E,C"));
+
+               CamelExchangeException cee = 
assertIsInstanceOf(CamelExchangeException.class, ex.getCause());
+               IllegalArgumentException iae = 
assertIsInstanceOf(IllegalArgumentException.class, cee.getCause());
+               assertEquals("Unknown key E", 
ex.getCause().getCause().getMessage());
+
+               mockF.assertIsSatisfied();
+               mockG.assertIsSatisfied();
+       }
+
+       @Test
+       public void testSplitAggregateStopOnAggregationException() throws 
InterruptedException {
+               MockEndpoint mockH = camelContext.getEndpoint("mock:h", 
MockEndpoint.class);
+               MockEndpoint mockJ = camelContext.getEndpoint("mock:j", 
MockEndpoint.class);
+
+               // without error aggregation is done as usual
+               mockH.expectedBodiesReceived("A", "B", "C");
+               mockJ.expectedBodiesReceived("A+B+C");
+
+               
producerTemplate.sendBody("direct:split-aggregate-stop-on-aggregation-exception",
 "A,B,C");
+
+               mockH.assertIsSatisfied();
+               mockJ.assertIsSatisfied();
+
+               mockH.reset();
+               mockJ.reset();
+
+               // 'E' is poison message which will lead to an error during 
aggregation
+               
producerTemplate.sendBody("direct:split-aggregate-stop-on-aggregation-exception",
 "A,B,E,C,D");
+
+               // TODO : THOSE TESTS ARE NOT CORRECT, ANY VALUE WOULD PASS
+               // Received all messages that went into aggregation, including 
corrupted one
+               mockH.expectedBodiesReceived("A", "B", "E");
+               // Since aggregation stopped, receiving all original messages
+               mockJ.expectedBodiesReceived("A,B,E,C,D");
+
+               mockH.assertIsSatisfied();
+               mockJ.assertIsSatisfied();
+       }
+}
diff --git a/pom.xml b/pom.xml
index d34b302..f9c6a90 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,219 +17,221 @@
     limitations under the License.
 
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.camel.springboot</groupId>
-        <artifactId>spring-boot</artifactId>
-        <version>3.7.0-SNAPSHOT</version>
-    </parent>
-
-    <groupId>org.apache.camel.springboot.example</groupId>
-    <artifactId>examples</artifactId>
-    <name>Camel SB :: Examples</name>
-    <description>Camel Examples</description>
-    <packaging>pom</packaging>
-
-    <modules>
-        <module>camel-example-spring-boot</module>
-        <module>camel-example-spring-boot-activemq</module>
-        <module>camel-example-spring-boot-actuator-http-metrics</module>
-        <module>camel-example-spring-boot-amqp</module>
-        <module>camel-example-spring-boot-apm-opentracing</module>
-        <module>camel-example-spring-boot-arangodb</module>
-        <module>camel-example-spring-boot-aws2-s3</module>
-        <module>camel-example-spring-boot-clustered-route-controller</module>
-        <module>camel-example-spring-boot-fhir</module>
-        <module>camel-example-spring-boot-fhir-auth-tx</module>
-        <module>camel-example-spring-boot-geocoder</module>
-        <module>camel-example-spring-boot-grpc</module>
-        <module>camel-example-spring-boot-grpc-kubernetes</module>
-        <module>camel-example-spring-boot-health-checks</module>
-        <module>camel-example-spring-boot-hystrix</module>
-        <module>camel-example-spring-boot-infinispan</module>
-        <module>camel-example-spring-boot-jira</module>
-        <module>camel-example-spring-boot-kafka-avro</module>
-        <module>camel-example-spring-boot-kafka-offsetrepository</module>
-        <module>camel-example-spring-boot-load-balancer-eip</module>
-        <module>camel-example-spring-boot-master</module>
-        <module>camel-example-spring-boot-metrics</module>
-        <module>camel-example-spring-boot-opentracing</module>
-        <module>camel-example-spring-boot-pojo</module>
-        <module>camel-example-spring-boot-rabbitmq</module>
-        <module>camel-example-spring-boot-reactive-streams</module>
-        <module>camel-example-spring-boot-resilience4j</module>
-        <module>camel-example-spring-boot-rest-jpa</module>
-        <module>camel-example-spring-boot-rest-producer</module>
-        <module>camel-example-spring-boot-rest-swagger</module>
-        <module>camel-example-spring-boot-rest-swagger-simple</module>
-        <module>camel-example-spring-boot-rest-openapi</module>
-        <module>camel-example-spring-boot-rest-openapi-simple</module>
-        <module>camel-example-spring-boot-servicecall</module>
-        <module>camel-example-spring-boot-supervising-route-controller</module>
-        <module>camel-example-spring-boot-twitter-salesforce</module>
-        <module>camel-example-spring-boot-type-converter</module>
-        <module>camel-example-spring-boot-undertow-spring-security</module>
-        <module>camel-example-spring-boot-validator</module>
-        <module>camel-example-spring-boot-webhook</module>
-        <module>camel-example-spring-boot-xml</module>
-        <module>camel-example-spring-boot-zipkin</module>
-        <module>camel-example-spring-boot-strimzi</module>
-        <module>camel-example-spring-cloud-servicecall</module>
-        <module>camel-example-spring-cloud-serviceregistry</module>
-        <module>camel-example-spring-boot-widget-gadget</module>
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+                xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+
+       <modelVersion>4.0.0</modelVersion>
+
+       <parent>
+               <groupId>org.apache.camel.springboot</groupId>
+               <artifactId>spring-boot</artifactId>
+               <version>3.7.0-SNAPSHOT</version>
+       </parent>
+
+       <groupId>org.apache.camel.springboot.example</groupId>
+       <artifactId>examples</artifactId>
+       <name>Camel SB :: Examples</name>
+       <description>Camel Examples</description>
+       <packaging>pom</packaging>
+
+       <modules>
+               <module>camel-example-spring-boot</module>
+               <module>camel-example-spring-boot-activemq</module>
+               <module>camel-example-spring-boot-actuator-http-metrics</module>
+               <module>camel-example-spring-boot-amqp</module>
+               <module>camel-example-spring-boot-apm-opentracing</module>
+               <module>camel-example-spring-boot-arangodb</module>
+               <module>camel-example-spring-boot-aws2-s3</module>
+               
<module>camel-example-spring-boot-clustered-route-controller</module>
+               <module>camel-example-spring-boot-fhir</module>
+               <module>camel-example-spring-boot-fhir-auth-tx</module>
+               <module>camel-example-spring-boot-geocoder</module>
+               <module>camel-example-spring-boot-grpc</module>
+               <module>camel-example-spring-boot-grpc-kubernetes</module>
+               <module>camel-example-spring-boot-health-checks</module>
+               <module>camel-example-spring-boot-hystrix</module>
+               <module>camel-example-spring-boot-infinispan</module>
+               <module>camel-example-spring-boot-jira</module>
+               <module>camel-example-spring-boot-kafka-avro</module>
+               
<module>camel-example-spring-boot-kafka-offsetrepository</module>
+               <module>camel-example-spring-boot-load-balancer-eip</module>
+               <module>camel-example-spring-boot-master</module>
+               <module>camel-example-spring-boot-metrics</module>
+               <module>camel-example-spring-boot-opentracing</module>
+               <module>camel-example-spring-boot-pojo</module>
+               <module>camel-example-spring-boot-rabbitmq</module>
+               <module>camel-example-spring-boot-reactive-streams</module>
+               <module>camel-example-spring-boot-resilience4j</module>
+               <module>camel-example-spring-boot-rest-jpa</module>
+               <module>camel-example-spring-boot-rest-producer</module>
+               <module>camel-example-spring-boot-rest-swagger</module>
+               <module>camel-example-spring-boot-rest-swagger-simple</module>
+               <module>camel-example-spring-boot-rest-openapi</module>
+               <module>camel-example-spring-boot-rest-openapi-simple</module>
+               <module>camel-example-spring-boot-servicecall</module>
+               
<module>camel-example-spring-boot-supervising-route-controller</module>
+               <module>camel-example-spring-boot-twitter-salesforce</module>
+               <module>camel-example-spring-boot-type-converter</module>
+               
<module>camel-example-spring-boot-undertow-spring-security</module>
+               <module>camel-example-spring-boot-validator</module>
+               <module>camel-example-spring-boot-webhook</module>
+               <module>camel-example-spring-boot-xml</module>
+               <module>camel-example-spring-boot-zipkin</module>
+               <module>camel-example-spring-boot-strimzi</module>
+               <module>camel-example-spring-cloud-servicecall</module>
+               <module>camel-example-spring-cloud-serviceregistry</module>
+               <module>camel-example-spring-boot-splitter-eip</module>
+               <module>camel-example-spring-boot-widget-gadget</module>
                <module>camel-example-spring-boot-unit-testing</module>
        </modules>
 
-    <properties>
-        <!-- for symbolicName in OSGi examples we only want the artifactId, eg 
camel-example-sql -->
-        <!-- as having org.apache.camel as prefix is not needed and makes the 
name very long -->
-        
<camel.osgi.symbolic.name>${project.artifactId}</camel.osgi.symbolic.name>
-        <camel-version>3.7.0-SNAPSHOT</camel-version>
-        <skip.starting.camel.context>false</skip.starting.camel.context>
-        <javax.servlet.api.version>4.0.1</javax.servlet.api.version>
-        <camel.osgi.export.pkg />
-        <fabric8-maven-plugin-version>4.4.1</fabric8-maven-plugin-version>
-        <kafka-avro-serializer-version>5.2.2</kafka-avro-serializer-version>
-        <reactor-version>3.2.16.RELEASE</reactor-version>
-        <testcontainers-version>1.14.3</testcontainers-version>
-        <tomcat-version>9.0.31</tomcat-version>
-    </properties>
-
-    <repositories>
-        <repository>
-            <id>apache.snapshots</id>
-            <url>https://repository.apache.org/snapshots/</url>
-            <name>Apache Snapshot Repo</name>
-            <snapshots>
-                <enabled>true</enabled>
-            </snapshots>
-            <releases>
-                <enabled>false</enabled>
-            </releases>
-        </repository>
-    </repositories>
-    <pluginRepositories>
-        <pluginRepository>
-            <id>apache.snapshots</id>
-            <url>https://repository.apache.org/snapshots/</url>
-            <snapshots>
-                <enabled>true</enabled>
-            </snapshots>
-            <releases>
-                <enabled>false</enabled>
-            </releases>
-        </pluginRepository>
-    </pluginRepositories>
-
-    <dependencyManagement>
-        <dependencies>
-            <!--
-              CAMEL-13084 Fix the spring-boot examples start up error by 
overriding servlet API version from camel-parent
-              Wqe need to clean it up once camel-parent upgrade the servlet 
api version.
-            -->
-            <dependency>
-                <groupId>javax.servlet</groupId>
-                <artifactId>javax.servlet-api</artifactId>
-                <version>${javax.servlet.api.version}</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <build>
-        <!--<resources>-->
-        <!--<resource>-->
-        <!--<directory>src/main/resources</directory>-->
-        <!--<filtering>true</filtering>-->
-        <!--</resource>-->
-        <!--</resources>-->
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-deploy-plugin</artifactId>
-                <configuration>
-                    <skip>true</skip>
-                </configuration>
-            </plugin>
-
-            <!-- update readme file -->
-            <plugin>
-                <groupId>org.apache.camel</groupId>
-                <artifactId>camel-package-maven-plugin</artifactId>
-                <version>${camel-version}</version>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>prepare-example</goal>
-                        </goals>
-                        <phase>process-resources</phase>
-                    </execution>
-                </executions>
-            </plugin>
-
-            <!-- to validate Camel endpoints: mvn camel-report:validate -->
-            <plugin>
-                <groupId>org.apache.camel</groupId>
-                <artifactId>camel-report-maven-plugin</artifactId>
-                <version>${camel-version}</version>
-                <configuration>
-                    <failOnError>false</failOnError>
-                    <includeTest>true</includeTest>
-                    <includeXml>true</includeXml>
-                    <ignoreLenientProperties>false</ignoreLenientProperties>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <forkCount>1</forkCount>
-                    <reuseForks>false</reuseForks>
-                    <systemPropertyVariables>
-                        
<skipStartingCamelContext>${skip.starting.camel.context}</skipStartingCamelContext>
-                    </systemPropertyVariables>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>container-test</id>
-            <properties>
-                <skip.starting.camel.context>true</skip.starting.camel.context>
-            </properties>
-        </profile>
-        <!--
-          This profile allows you to add a repository to the repo list so that
-          you can test the examples out against a staged version of the camel 
distribution
-        -->
-        <profile>
-            <id>add-remote-repo</id>
-            <activation>
-                <property>
-                    <name>remoteRepo</name>
-                </property>
-            </activation>
-
-            <repositories>
-                <repository>
-                    <id>dynamic.repo</id>
-                    <name>Repository Dynamically Added Via the Command 
Line</name>
-                    <url>$remoteRepo</url>
-                </repository>
-            </repositories>
-            <pluginRepositories>
-                <pluginRepository>
-                    <id>dynamic.repo</id>
-                    <name>Repository Dynamically Added Via the Command 
Line</name>
-                    <url>$remoteRepo</url>
-                </pluginRepository>
-            </pluginRepositories>
-
-        </profile>
-    </profiles>
+       <properties>
+               <!-- for symbolicName in OSGi examples we only want the 
artifactId, eg camel-example-sql -->
+               <!-- as having org.apache.camel as prefix is not needed and 
makes the name very long -->
+               
<camel.osgi.symbolic.name>${project.artifactId}</camel.osgi.symbolic.name>
+               <camel-version>3.7.0-SNAPSHOT</camel-version>
+               <skip.starting.camel.context>false</skip.starting.camel.context>
+               <javax.servlet.api.version>4.0.1</javax.servlet.api.version>
+               <camel.osgi.export.pkg/>
+               
<fabric8-maven-plugin-version>4.4.1</fabric8-maven-plugin-version>
+               
<kafka-avro-serializer-version>5.2.2</kafka-avro-serializer-version>
+               <reactor-version>3.2.16.RELEASE</reactor-version>
+               <testcontainers-version>1.14.3</testcontainers-version>
+               <tomcat-version>9.0.31</tomcat-version>
+       </properties>
+
+       <repositories>
+               <repository>
+                       <id>apache.snapshots</id>
+                       <url>https://repository.apache.org/snapshots/</url>
+                       <name>Apache Snapshot Repo</name>
+                       <snapshots>
+                               <enabled>true</enabled>
+                       </snapshots>
+                       <releases>
+                               <enabled>false</enabled>
+                       </releases>
+               </repository>
+       </repositories>
+       <pluginRepositories>
+               <pluginRepository>
+                       <id>apache.snapshots</id>
+                       <url>https://repository.apache.org/snapshots/</url>
+                       <snapshots>
+                               <enabled>true</enabled>
+                       </snapshots>
+                       <releases>
+                               <enabled>false</enabled>
+                       </releases>
+               </pluginRepository>
+       </pluginRepositories>
+
+       <dependencyManagement>
+               <dependencies>
+                       <!--
+                         CAMEL-13084 Fix the spring-boot examples start up 
error by overriding servlet API version from camel-parent
+                         Wqe need to clean it up once camel-parent upgrade the 
servlet api version.
+                       -->
+                       <dependency>
+                               <groupId>javax.servlet</groupId>
+                               <artifactId>javax.servlet-api</artifactId>
+                               <version>${javax.servlet.api.version}</version>
+                       </dependency>
+               </dependencies>
+       </dependencyManagement>
+
+       <build>
+               <!--<resources>-->
+               <!--<resource>-->
+               <!--<directory>src/main/resources</directory>-->
+               <!--<filtering>true</filtering>-->
+               <!--</resource>-->
+               <!--</resources>-->
+               <plugins>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-deploy-plugin</artifactId>
+                               <configuration>
+                                       <skip>true</skip>
+                               </configuration>
+                       </plugin>
+
+                       <!-- update readme file -->
+                       <plugin>
+                               <groupId>org.apache.camel</groupId>
+                               
<artifactId>camel-package-maven-plugin</artifactId>
+                               <version>${camel-version}</version>
+                               <executions>
+                                       <execution>
+                                               <goals>
+                                                       
<goal>prepare-example</goal>
+                                               </goals>
+                                               <phase>process-resources</phase>
+                                       </execution>
+                               </executions>
+                       </plugin>
+
+                       <!-- to validate Camel endpoints: mvn 
camel-report:validate -->
+                       <plugin>
+                               <groupId>org.apache.camel</groupId>
+                               
<artifactId>camel-report-maven-plugin</artifactId>
+                               <version>${camel-version}</version>
+                               <configuration>
+                                       <failOnError>false</failOnError>
+                                       <includeTest>true</includeTest>
+                                       <includeXml>true</includeXml>
+                                       
<ignoreLenientProperties>false</ignoreLenientProperties>
+                               </configuration>
+                       </plugin>
+
+                       <plugin>
+                               <artifactId>maven-surefire-plugin</artifactId>
+                               <configuration>
+                                       <forkCount>1</forkCount>
+                                       <reuseForks>false</reuseForks>
+                                       <systemPropertyVariables>
+                                               
<skipStartingCamelContext>${skip.starting.camel.context}</skipStartingCamelContext>
+                                       </systemPropertyVariables>
+                               </configuration>
+                       </plugin>
+               </plugins>
+       </build>
+
+       <profiles>
+               <profile>
+                       <id>container-test</id>
+                       <properties>
+                               
<skip.starting.camel.context>true</skip.starting.camel.context>
+                       </properties>
+               </profile>
+               <!--
+                 This profile allows you to add a repository to the repo list 
so that
+                 you can test the examples out against a staged version of the 
camel distribution
+               -->
+               <profile>
+                       <id>add-remote-repo</id>
+                       <activation>
+                               <property>
+                                       <name>remoteRepo</name>
+                               </property>
+                       </activation>
+
+                       <repositories>
+                               <repository>
+                                       <id>dynamic.repo</id>
+                                       <name>Repository Dynamically Added Via 
the Command Line</name>
+                                       <url>$remoteRepo</url>
+                               </repository>
+                       </repositories>
+                       <pluginRepositories>
+                               <pluginRepository>
+                                       <id>dynamic.repo</id>
+                                       <name>Repository Dynamically Added Via 
the Command Line</name>
+                                       <url>$remoteRepo</url>
+                               </pluginRepository>
+                       </pluginRepositories>
+
+               </profile>
+       </profiles>
 
 </project>

Reply via email to