Repository: camel Updated Branches: refs/heads/master 080e40dfa -> 4c8eab4e7
Add little rest producer example Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/4c8eab4e Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/4c8eab4e Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/4c8eab4e Branch: refs/heads/master Commit: 4c8eab4e7358865a8ba09bc395232fcadb9260f3 Parents: 080e40d Author: Claus Ibsen <davscl...@apache.org> Authored: Tue Mar 7 10:52:00 2017 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Tue Mar 7 10:52:14 2017 +0100 ---------------------------------------------------------------------- examples/README.adoc | 4 +- examples/camel-example-rest-producer/pom.xml | 127 +++++++++++++++++++ .../camel-example-rest-producer/readme.adoc | 34 +++++ .../main/java/sample/camel/PetController.java | 43 +++++++ .../main/java/sample/camel/RestApplication.java | 37 ++++++ .../src/main/java/sample/camel/RestRoute.java | 41 ++++++ .../src/main/resources/application.properties | 25 ++++ .../java/sample/camel/RestApplicationTest.java | 47 +++++++ 8 files changed, 357 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/4c8eab4e/examples/README.adoc ---------------------------------------------------------------------- diff --git a/examples/README.adoc b/examples/README.adoc index de1e672..5547818 100644 --- a/examples/README.adoc +++ b/examples/README.adoc @@ -11,7 +11,7 @@ View the individual example READMEs for details. ### Examples // examples: START -Number of Examples: 86 (7 deprecated) +Number of Examples: 87 (7 deprecated) [width="100%",cols="4,2,4",options="header"] |======================================================================= @@ -160,6 +160,8 @@ Number of Examples: 86 (7 deprecated) | link:camel-example-cdi-rest-servlet/README.md[CDI Rest] (camel-example-cdi-rest-servlet) | Rest | REST DSL / Servlet with CDI example +| link:camel-example-rest-producer/readme.adoc[Rest Producer] (camel-example-rest-producer) | Rest | An example showing how to use Camel Rest to call a REST service + | link:camel-example-restlet-jdbc/README.md[Restlet JDBC] (camel-example-restlet-jdbc) | Rest | An example showing how to create REST API with Camel Restlet and JDBC components | link:camel-example-spark-rest/README.md[Spark REST] (camel-example-spark-rest) | Rest | An example using Spark REST http://git-wip-us.apache.org/repos/asf/camel/blob/4c8eab4e/examples/camel-example-rest-producer/pom.xml ---------------------------------------------------------------------- diff --git a/examples/camel-example-rest-producer/pom.xml b/examples/camel-example-rest-producer/pom.xml new file mode 100644 index 0000000..6954127 --- /dev/null +++ b/examples/camel-example-rest-producer/pom.xml @@ -0,0 +1,127 @@ +<?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/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.camel</groupId> + <artifactId>examples</artifactId> + <version>2.19.0-SNAPSHOT</version> + </parent> + + <artifactId>camel-example-rest-producer</artifactId> + <name>Camel :: Example :: Rest Producer</name> + <description>An example showing how to use Camel Rest to call a REST service</description> + + <properties> + <category>Rest</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</groupId> + <artifactId>camel-spring-boot-dependencies</artifactId> + <version>${project.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + + <dependencies> + + <!-- Spring Boot --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-undertow</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-actuator</artifactId> + </dependency> + + <!-- Camel --> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-spring-boot-starter</artifactId> + </dependency> + + <!-- support swagger api-doc --> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-swagger-java-starter</artifactId> + </dependency> + + <!-- use http4 as rest producer --> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-http4-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</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> + </plugins> + </build> + +</project> http://git-wip-us.apache.org/repos/asf/camel/blob/4c8eab4e/examples/camel-example-rest-producer/readme.adoc ---------------------------------------------------------------------- diff --git a/examples/camel-example-rest-producer/readme.adoc b/examples/camel-example-rest-producer/readme.adoc new file mode 100644 index 0000000..3798bc8 --- /dev/null +++ b/examples/camel-example-rest-producer/readme.adoc @@ -0,0 +1,34 @@ +# Camel Example Rest Producer + +This example shows how to call a REST service using Camel Rest. + +The example uses a timer to trigger a Camel route to call the REST service. +The REST service is embedded within Spring Boot itself so it can run standalone. + +## Camel routes + +The Camel route is located in the `RestRoute` class. In this class the route +starts from a timer, that triggers every 2nd second and calls the REST service using the rest endpoint +which returns a message, that is logged. + +## Configuring Rest + +The rest producer is configured using Camels Rest DSL which is done using the `restConfiguration` in the route. +The actual HTTP client that is used to call the REST service is `camel-http4` which is added as dependency +in the `pom.xml` file. You can use other HTTP clients with the REST producer such as + +- camel-http +- camel-netty4-http +- camel-jetty +- camel-restlet +- camel-undertow + +## How to run + +You can run this example using + + mvn spring-boot:run + +## More information + +You can find more information about Apache Camel at the website: http://camel.apache.org/ http://git-wip-us.apache.org/repos/asf/camel/blob/4c8eab4e/examples/camel-example-rest-producer/src/main/java/sample/camel/PetController.java ---------------------------------------------------------------------- diff --git a/examples/camel-example-rest-producer/src/main/java/sample/camel/PetController.java b/examples/camel-example-rest-producer/src/main/java/sample/camel/PetController.java new file mode 100644 index 0000000..c1234a6 --- /dev/null +++ b/examples/camel-example-rest-producer/src/main/java/sample/camel/PetController.java @@ -0,0 +1,43 @@ +/** + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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 sample.camel; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * Used for simulating a rest service which we can run locally inside Spring Boot + */ +@RestController +public class PetController { + + private static String[] PETS = new String[]{"Snoopy", "Fido", "Tony the Tiger"}; + + @RequestMapping(value = "/petById/{id}", produces = "application/json") + public String petById(@PathVariable("id") Integer id) { + if (id != null && id > 0 && id <= PETS.length + 1) { + int index = id - 1; + String pet = PETS[index]; + return String.format("{ \"name\": \"%s\" }", pet); + } else { + // empty pet + return "{ }"; + } + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/4c8eab4e/examples/camel-example-rest-producer/src/main/java/sample/camel/RestApplication.java ---------------------------------------------------------------------- diff --git a/examples/camel-example-rest-producer/src/main/java/sample/camel/RestApplication.java b/examples/camel-example-rest-producer/src/main/java/sample/camel/RestApplication.java new file mode 100644 index 0000000..82020f5 --- /dev/null +++ b/examples/camel-example-rest-producer/src/main/java/sample/camel/RestApplication.java @@ -0,0 +1,37 @@ +/** + * 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 sample.camel; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +//CHECKSTYLE:OFF +/** + * A Spring Boot application that starts the Camel routes. + */ +@SpringBootApplication +public class RestApplication { + + /** + * A main method to start this application. + */ + public static void main(String[] args) { + SpringApplication.run(RestApplication.class, args); + } + +} +//CHECKSTYLE:ON http://git-wip-us.apache.org/repos/asf/camel/blob/4c8eab4e/examples/camel-example-rest-producer/src/main/java/sample/camel/RestRoute.java ---------------------------------------------------------------------- diff --git a/examples/camel-example-rest-producer/src/main/java/sample/camel/RestRoute.java b/examples/camel-example-rest-producer/src/main/java/sample/camel/RestRoute.java new file mode 100644 index 0000000..dc2b2f8 --- /dev/null +++ b/examples/camel-example-rest-producer/src/main/java/sample/camel/RestRoute.java @@ -0,0 +1,41 @@ +/** + * 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 sample.camel; + +import org.apache.camel.builder.RouteBuilder; +import org.springframework.stereotype.Component; + +/** + * A Camel route that calls the REST service using a timer + * <p/> + * Use <tt>@Component</tt> to make Camel auto detect this route when starting. + */ +@Component +public class RestRoute extends RouteBuilder { + + @Override + public void configure() throws Exception { + // call the embedded rest service from the PetController + restConfiguration().host("localhost").port(8080); + + from("timer:hello?period={{timer.period}}") + .setHeader("id", simple("${random(1,3)}")) + .to("rest:get:petById/{id}") + .log("${body}"); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/4c8eab4e/examples/camel-example-rest-producer/src/main/resources/application.properties ---------------------------------------------------------------------- diff --git a/examples/camel-example-rest-producer/src/main/resources/application.properties b/examples/camel-example-rest-producer/src/main/resources/application.properties new file mode 100644 index 0000000..4db845a --- /dev/null +++ b/examples/camel-example-rest-producer/src/main/resources/application.properties @@ -0,0 +1,25 @@ +# +# 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 = RestCamel + +# properties used in the Camel route and beans +# -------------------------------------------- + +# how often to trigger the timer +timer.period = 2000 http://git-wip-us.apache.org/repos/asf/camel/blob/4c8eab4e/examples/camel-example-rest-producer/src/test/java/sample/camel/RestApplicationTest.java ---------------------------------------------------------------------- diff --git a/examples/camel-example-rest-producer/src/test/java/sample/camel/RestApplicationTest.java b/examples/camel-example-rest-producer/src/test/java/sample/camel/RestApplicationTest.java new file mode 100644 index 0000000..ecb78a3 --- /dev/null +++ b/examples/camel-example-rest-producer/src/test/java/sample/camel/RestApplicationTest.java @@ -0,0 +1,47 @@ +/** + * 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 sample.camel; + +import java.util.concurrent.TimeUnit; + +import org.apache.camel.CamelContext; +import org.apache.camel.builder.NotifyBuilder; +import org.apache.camel.test.spring.CamelSpringBootRunner; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.Assert.assertTrue; + +@RunWith(CamelSpringBootRunner.class) +@SpringBootTest(classes = RestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) +public class RestApplicationTest { + + @Autowired + private CamelContext camelContext; + + @Test + public void shouldProduceMessages() throws Exception { + // we expect that one or more messages is automatic done by the Camel + // route as it uses a timer to trigger + NotifyBuilder notify = new NotifyBuilder(camelContext).whenDone(1).create(); + + assertTrue(notify.matches(10, TimeUnit.SECONDS)); + } + +}