随着软件世界的发展,正在开发更加复杂的系统,这些系统必须相互集成。 它从SOA开始,然后一直到微服务。
骆驼是我想到的第一大集成工具,因为如今的骆驼springboot是一个非常强大的组合。
第一步是将骆驼依赖项包含到我们的spring项目中。
buildscript {ext {springBootVersion = '1.5.9.BUILD-SNAPSHOT'}repositories {mavenCentral()maven { url "https://repo.spring.io/snapshot" }maven { url "https://repo.spring.io/milestone" }}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")}
}apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'group = 'com.gkatzioura'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8repositories {mavenCentral()maven { url "https://repo.spring.io/snapshot" }maven { url "https://repo.spring.io/milestone" }
}dependencies {compile('org.apache.camel:camel-spring-boot-starter:2.20.0')testCompile('org.springframework.boot:spring-boot-starter-test')testCompile('org.apache.camel:camel-test-spring:2.20.0')
}
为了从头开始更快地进行项目设置,您可以始终使用在线spring 初始化程序 。
现在让我们添加一条简单的路线
package com.gkatzioura.springcamel.routes;import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;@Component
public class TimerRoute extends RouteBuilder {public static final String ROUTE_NAME = "TIMER_ROUTE";@Overridepublic void configure() throws Exception {from("timer:initial//start?period=10000").routeId(ROUTE_NAME).to("log:executed");}
}
我们不必担心骆驼上下文的配置,因为Camel自动配置会为您创建一个SpringCamelContext并负责该上下文的正确初始化和关闭。
骆驼自动配置还从Spring上下文中收集所有RouteBuilder实例,并将它们自动注入到提供的CamelContext中。 因此,我们不必注册到CamelContext的路线。
如您所见,我们的路由具有一个计时器,该计时器的周期为10000毫秒,该计时器路由到日志端点。 日志端点将每10000毫秒打印一次执行的字符串。
请记住,如果未指定routeId,骆驼将自己分配一个名称,因此在我们要检索根定义的情况下,为我们的路线定义命名是一个好习惯。
为了使骆驼保持不动,我们需要保持主线程处于阻塞状态。 因此,我们将此配置添加到application.yml文件中。
camel:springboot:main-run-controller: true
代替这个,我们可以包括spring-boot-starter-web依赖关系,但是我们的应用程序具有尽可能少的依赖关系,因此我们需要保持这种方式。
但是,与其他系统集成中最困难的部分是测试。 多年来,我们在测试和使用的工具方面取得了长足的进步。
骆驼还带有一些很棒的工具,以便进行单元测试。
例如,我们将对先前指定的路线进行测试。
@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
public class SpringCamelApplicationTests {@EndpointInject(uri = MOCK_RESULT)private MockEndpoint resultEndpoint;@Autowiredprivate CamelContext camelContext;@EndpointInject(uri = MOCK_TIMER)private ProducerTemplate producer;private static final String MOCK_RESULT = "mock:result";private static final String MOCK_TIMER = "direct:mock-timer";@Beforepublic void setup() throws Exception {camelContext.getRouteDefinition(TimerRoute.ROUTE_NAME).autoStartup(true).adviceWith(camelContext, new AdviceWithRouteBuilder() {@Overridepublic void configure() throws Exception {replaceFromWith(MOCK_TIMER);interceptSendToEndpoint("log*").skipSendToOriginalEndpoint().to(MOCK_RESULT);}});}@Testpublic void sendMessage() throws Exception {resultEndpoint.expectedMessageCount(1);producer.sendBody("A message");resultEndpoint.assertIsSatisfied();}}
让我们看一下测试的每个部分。
我们选择的JUnit运行器将是CamelSpringBootRunner.class
@RunWith(CamelSpringBootRunner.class)
我们注入一个ProducerTemplate 。 通过ProducerTemplate接口,您可以通过各种不同的方式将消息交换发送到端点,从而可以轻松地从Java代码使用Camel Endpoint实例。
然后我们注入一个MockEndpoint。 MockEndpoint将通过替换原始端点为我们服务。 然后,我们将设置预期的接收消息数。 处理完成后,我们断言已满足接收消息的数量。
在我们的设置方法中,我们将用伪造的生产者模板端点替换原始端点。 这样,我们的路线将接收到我们将从ProducerTemplate发出的事件。
然后,我们还将拦截日志端点,并将消息定向到先前指定的MockEndpoint。
因此,我们最终得到了骆驼应用程序和指定路线的单元测试。 您可以在github上找到源代码。
翻译自: https://www.javacodegeeks.com/2017/11/spring-boot-apache-camel.html