Skip to content

Commit 15d2fce

Browse files
committed
apache camel module fix #55
[Apache Camel](http://camel.apache.org) integration for Jooby. Exposes a [CamelContext], [ProducerTemplate] and [ConsumerTemplate]. NOTE: This module was designed to provide a better integration with Jooby. This module doesn't depend on [camel-guice](http://camel.apache.org/guice.html), but it provides similar features. ```xml <dependency> <groupId>org.jooby</groupId> <artifactId>jooby-camel</artifactId> <version>{{version}}</version> </dependency> ``` ```java { use(new Camel() .routes((rb, config) -> { rb.from("direct:noop").to("mock:out"); }) ); get("/noop", req -> { req.require(ProducerTemplate.class).sendBody("direct:noop", "NOOP"); return "/noop"; }); } ``` Previous example, add a direct route using the Java DSL. A route builder can be created and injected by Guice, see next section. ```java public class MyRoutes extends RouteBuilder { @Inject public MyRoutes(Service service) { this.service = service; } public void configure() { from("direct:noop").to("mock:out").bean(service); } } ... { use(new Camel().routes(MyRoutes.class)); } ``` or without extending RouteBuilder: ```java public class MyRoutes { @Inject public MyRoutes(RouteBuilder router, Service service) { router.from("direct:noop").to("mock:out").bean(service); } } ... { use(new Camel().routes(MyRoutes.class)); } ``` Custom configuration is achieved in two ways: A [CamelContext] can be configured from your ```application.conf```: ``` camel.handleFault = false camel.shutdownRoute = Default camel.shutdownRunningTask = CompleteCurrentTaskOnly camel.streamCaching.enabled = false camel.tracing = false camel.autoStartup = true camel.allowUseOriginalMessage = false camel.jmx = false ``` Same for [ShutdownStrategy]: ``` camel.shutdown.shutdownRoutesInReverseOrder = true camel.shutdown.timeUnit = SECONDS camel.shutdown.timeout = 10 ``` [ThreadPoolProfile]: ``` camel.threads.poolSize = ${runtime.processors-plus1} camel.threads.maxPoolSize = ${runtime.processors-x2} camel.threads.keepAliveTime = 60 camel.threads.timeUnit = SECONDS camel.threads.rejectedPolicy = CallerRuns camel.threads.maxQueueSize = 1000 camel.threads.id = default camel.threads.defaultProfile = true ``` And [StreamCachingStrategy]: ``` camel.streamCaching.enabled = false camel.streamCaching.spoolDirectory = ${application.tmpdir}${file.separator}"camel"${file.separator}"#uuid#" ``` Using the ```doWith(Configurer)``` method: ```java { use(new Camel().doWith((ctx, config) -> { // set/override any other property. })); } ``` That's all folks! Enjoy it!!!
1 parent 70a0c65 commit 15d2fce

18 files changed

Lines changed: 2521 additions & 0 deletions

File tree

coverage-report/pom.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
<source>${project.parent.basedir}/jooby-quartz/src/main/java</source>
4646
<source>${project.parent.basedir}/jooby-jdbi/src/main/java</source>
4747
<source>${project.parent.basedir}/jooby-ftl/src/main/java</source>
48+
<source>${project.parent.basedir}/jooby-camel/src/main/java</source>
4849
</sources>
4950
</configuration>
5051
</execution>
@@ -68,6 +69,7 @@
6869
<source>${project.parent.basedir}/jooby-quartz/src/test/java</source>
6970
<source>${project.parent.basedir}/jooby-jdbi/src/test/java</source>
7071
<source>${project.parent.basedir}/jooby-ftl/src/test/java</source>
72+
<source>${project.parent.basedir}/jooby-camel/src/test/java</source>
7173
</sources>
7274
</configuration>
7375
</execution>
@@ -209,6 +211,12 @@
209211
<version>${project.version}</version>
210212
</dependency>
211213

214+
<dependency>
215+
<groupId>org.jooby</groupId>
216+
<artifactId>jooby-camel</artifactId>
217+
<version>${project.version}</version>
218+
</dependency>
219+
212220
<!-- Servers -->
213221
<dependency>
214222
<groupId>org.jooby</groupId>
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.jooby.camel;
2+
3+
import org.apache.camel.ProducerTemplate;
4+
import org.apache.camel.builder.RouteBuilder;
5+
import org.jooby.test.ServerFeature;
6+
import org.junit.Test;
7+
8+
public class CamelCustomConfigFeature extends ServerFeature {
9+
10+
{
11+
use(new Camel()
12+
.doWith((ctx, config) -> {
13+
ctx.addRoutes(new RouteBuilder() {
14+
15+
@Override
16+
public void configure() throws Exception {
17+
from("direct:noop").to("mock:out");
18+
}
19+
});
20+
}));
21+
22+
get("/noop", req -> {
23+
req.require(ProducerTemplate.class).sendBody("direct:noop", "NOOP");
24+
return req.path();
25+
});
26+
}
27+
28+
@Test
29+
public void noop() throws Exception {
30+
request()
31+
.get("/noop")
32+
.expect("/noop");
33+
}
34+
35+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.jooby.camel;
2+
3+
import org.apache.camel.CamelContext;
4+
import org.apache.camel.ConsumerTemplate;
5+
import org.apache.camel.ProducerTemplate;
6+
import org.jooby.test.ServerFeature;
7+
import org.junit.Test;
8+
9+
public class CamelFeature extends ServerFeature {
10+
11+
{
12+
use(new Camel());
13+
14+
get("/", req -> req.require(CamelContext.class).getClass().getName());
15+
16+
get("/producer", req -> req.require(ProducerTemplate.class).getClass().getName());
17+
18+
get("/consumer", req -> req.require(ConsumerTemplate.class).getClass().getName());
19+
}
20+
21+
@Test
22+
public void boot() throws Exception {
23+
request()
24+
.get("/")
25+
.expect("org.apache.camel.impl.DefaultCamelContext");
26+
27+
request()
28+
.get("/producer")
29+
.expect("org.apache.camel.impl.DefaultProducerTemplate");
30+
31+
request()
32+
.get("/consumer")
33+
.expect("org.apache.camel.impl.DefaultConsumerTemplate");
34+
}
35+
36+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.jooby.camel;
2+
3+
import org.apache.camel.ProducerTemplate;
4+
import org.jooby.test.ServerFeature;
5+
import org.junit.Test;
6+
7+
public class CamelWithBasicRoutesFeature extends ServerFeature {
8+
9+
{
10+
use(new Camel()
11+
.routes((router, config) -> {
12+
router.from("direct:noop").to("mock:out");
13+
}));
14+
15+
get("/noop", req -> {
16+
req.require(ProducerTemplate.class).sendBody("direct:noop", "NOOP");
17+
return req.path();
18+
});
19+
}
20+
21+
@Test
22+
public void noop() throws Exception {
23+
request()
24+
.get("/noop")
25+
.expect("/noop");
26+
}
27+
28+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package org.jooby.camel;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import javax.inject.Inject;
6+
7+
import org.apache.camel.Exchange;
8+
import org.apache.camel.Processor;
9+
import org.apache.camel.ProducerTemplate;
10+
import org.apache.camel.builder.RouteBuilder;
11+
import org.jooby.test.ServerFeature;
12+
import org.junit.Test;
13+
14+
import com.typesafe.config.ConfigFactory;
15+
import com.typesafe.config.ConfigValueFactory;
16+
17+
public class CamelWithInjectableBeanAsRoutesFeature extends ServerFeature {
18+
19+
public static class Railway {
20+
21+
@Inject
22+
public Railway(final RouteBuilder router, final Printer printer) {
23+
router.from("direct:di").transform().simple("Hi ${you}!").process(printer);
24+
}
25+
26+
}
27+
28+
public static class Printer implements Processor {
29+
30+
@Override
31+
public void process(final Exchange exchange) throws Exception {
32+
String message = exchange.getIn().getBody(String.class);
33+
assertEquals("Hi Camel!", message);
34+
}
35+
36+
}
37+
38+
{
39+
use(ConfigFactory.empty()
40+
.withValue("you", ConfigValueFactory.fromAnyRef("Camel")));
41+
42+
use(new Camel().routes(Railway.class));
43+
44+
get("/di", req -> {
45+
req.require(ProducerTemplate.class).sendBody("direct:di", "...");
46+
return req.path();
47+
});
48+
}
49+
50+
@Test
51+
public void di() throws Exception {
52+
request()
53+
.get("/di")
54+
.expect("/di");
55+
}
56+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package org.jooby.camel;
2+
3+
import static java.util.Objects.requireNonNull;
4+
import static org.junit.Assert.assertEquals;
5+
6+
import javax.inject.Inject;
7+
8+
import org.apache.camel.Exchange;
9+
import org.apache.camel.Processor;
10+
import org.apache.camel.ProducerTemplate;
11+
import org.apache.camel.builder.RouteBuilder;
12+
import org.jooby.test.ServerFeature;
13+
import org.junit.Test;
14+
15+
import com.typesafe.config.ConfigFactory;
16+
import com.typesafe.config.ConfigValueFactory;
17+
18+
public class CamelWithInjectableRoutesFeature extends ServerFeature {
19+
20+
public static class Railway extends RouteBuilder {
21+
22+
private Printer printer;
23+
24+
@Inject
25+
public Railway(final Printer printer) {
26+
this.printer = requireNonNull(printer, "A printer is required.");
27+
}
28+
29+
@Override
30+
public void configure() throws Exception {
31+
from("direct:di").transform().simple("Hi ${you}!").process(printer);
32+
}
33+
}
34+
35+
public static class Printer implements Processor {
36+
37+
@Override
38+
public void process(final Exchange exchange) throws Exception {
39+
String message = exchange.getIn().getBody(String.class);
40+
assertEquals("Hi Camel!", message);
41+
}
42+
43+
}
44+
45+
{
46+
use(ConfigFactory.empty()
47+
.withValue("you", ConfigValueFactory.fromAnyRef("Camel")));
48+
49+
use(new Camel().routes(Railway.class));
50+
51+
get("/di", req -> {
52+
req.require(ProducerTemplate.class).sendBody("direct:di", "...");
53+
return req.path();
54+
});
55+
}
56+
57+
@Test
58+
public void di() throws Exception {
59+
request()
60+
.get("/di")
61+
.expect("/di");
62+
}
63+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.jooby.camel;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import org.apache.camel.CamelContext;
6+
import org.apache.camel.ProducerTemplate;
7+
import org.jooby.test.ServerFeature;
8+
import org.junit.Test;
9+
10+
import com.typesafe.config.ConfigFactory;
11+
import com.typesafe.config.ConfigValueFactory;
12+
13+
public class CamelWithPropertyResolverFeature extends ServerFeature {
14+
15+
{
16+
use(ConfigFactory.empty()
17+
.withValue("you", ConfigValueFactory.fromAnyRef("Camel")));
18+
19+
use(new Camel()
20+
.routes((router, config) -> {
21+
router.from("direct:props").transform().simple("Hi ${you}!").process(exchange -> {
22+
String message = exchange.getIn().getBody(String.class);
23+
assertEquals("Hi Camel!", message);
24+
});
25+
}));
26+
27+
get("/", req -> req.require(CamelContext.class).getClass().getName());
28+
29+
get("/props", req -> {
30+
req.require(ProducerTemplate.class).sendBody("direct:props", "...");
31+
return req.path();
32+
});
33+
}
34+
35+
@Test
36+
public void props() throws Exception {
37+
request()
38+
.get("/props")
39+
.expect("/props");
40+
}
41+
}

jooby-camel/pom.xml

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4+
5+
<parent>
6+
<groupId>org.jooby</groupId>
7+
<artifactId>jooby-project</artifactId>
8+
<version>0.5.0-SNAPSHOT</version>
9+
</parent>
10+
11+
<modelVersion>4.0.0</modelVersion>
12+
<artifactId>jooby-camel</artifactId>
13+
14+
<name>camel module</name>
15+
<description>Apache Camel for Jooby</description>
16+
17+
<build>
18+
<plugins>
19+
<!-- sure-fire -->
20+
<plugin>
21+
<groupId>org.apache.maven.plugins</groupId>
22+
<artifactId>maven-surefire-plugin</artifactId>
23+
<configuration>
24+
<includes>
25+
<include>**/*Test.java</include>
26+
<include>**/*Feature.java</include>
27+
<include>**/Issue*.java</include>
28+
</includes>
29+
</configuration>
30+
</plugin>
31+
32+
</plugins>
33+
</build>
34+
35+
<dependencies>
36+
<!-- Jooby -->
37+
<dependency>
38+
<groupId>org.jooby</groupId>
39+
<artifactId>jooby</artifactId>
40+
<version>${project.version}</version>
41+
</dependency>
42+
43+
<!-- Apache Camel -->
44+
<dependency>
45+
<groupId>org.apache.camel</groupId>
46+
<artifactId>camel-core</artifactId>
47+
</dependency>
48+
49+
<dependency>
50+
<groupId>org.apache.camel</groupId>
51+
<artifactId>camel-guice</artifactId>
52+
<version>${camel.version}</version>
53+
</dependency>
54+
55+
<!-- Test dependencies -->
56+
<dependency>
57+
<groupId>org.jooby</groupId>
58+
<artifactId>jooby</artifactId>
59+
<version>${project.version}</version>
60+
<scope>test</scope>
61+
<classifier>tests</classifier>
62+
</dependency>
63+
64+
<dependency>
65+
<groupId>junit</groupId>
66+
<artifactId>junit</artifactId>
67+
<scope>test</scope>
68+
</dependency>
69+
70+
<dependency>
71+
<groupId>org.easymock</groupId>
72+
<artifactId>easymock</artifactId>
73+
<scope>test</scope>
74+
</dependency>
75+
76+
<dependency>
77+
<groupId>org.powermock</groupId>
78+
<artifactId>powermock-api-easymock</artifactId>
79+
<scope>test</scope>
80+
</dependency>
81+
82+
<dependency>
83+
<groupId>org.powermock</groupId>
84+
<artifactId>powermock-module-junit4</artifactId>
85+
<scope>test</scope>
86+
</dependency>
87+
88+
<dependency>
89+
<groupId>org.jacoco</groupId>
90+
<artifactId>org.jacoco.agent</artifactId>
91+
<classifier>runtime</classifier>
92+
<scope>test</scope>
93+
</dependency>
94+
95+
</dependencies>
96+
97+
</project>

0 commit comments

Comments
 (0)