龙空技术网

Spring Boot整合Apache Camel

农非农 2016

前言:

目前咱们对“apachespring官网下载”大体比较关注,各位老铁们都想要知道一些“apachespring官网下载”的相关文章。那么小编在网络上汇集了一些关于“apachespring官网下载””的相关资讯,希望同学们能喜欢,你们一起来学习一下吧!

1. 概述

Apache Camel的核心是一个集成引擎,简单地说,它可以用来促进各种技术之间的交互。

服务和技术之间的这些桥梁称为路由。路由在引擎(CamelContext)上实现,它们与所谓的“exchange messages”进行通信。

Camel的消息传递系统(Message System):

终端(Message Endpoint):可以是异构的业务系统,都需要提供Endpoint实现集成。通道(Message Channel):两个应用之间进行信息通讯的通道。消息(Message):Endpoint之间交互的标准化单位。路由(Message Router):根据一定的条件,将消息传递给不同的过滤器以实现对单个处理步骤的解耦。转换器(Message Translator):消息在传输过程中的转换和数据映射,包括报文格式转换和内容转换映射。管道和过滤器(Pipes & Filters):在保持独立性和灵活性的基础上,对复杂的消息进行处理。

CAMEL的应用场景:

消息汇聚:比如将来自不同服务器的数据,有ActiveMQ、RabbitMQ、WebService等的数据合成报表。消息分发:将消息从消息生产者转发给消息接收者,分发方式分为两种:顺序分发&并行分发。消息转换:将消息内容进行转换,比如xml转为json格式。规则引擎:可以使用Spring XML配置或DSL来定义route。同时camel提供了大量内置Processor,用于逻辑运算、过滤等,这样更容易灵活的管理route。2. Maven 依赖项

首先,我们需要包含Spring Boot,Camel,Rest API与Swagger和JSON的依赖项:

<dependencies>    <dependency>        <groupId>org.apache.camel.springboot</groupId>        <artifactId>camel-servlet-starter</artifactId>        <version>3.21.0</version>    </dependency>    <dependency>        <groupId>org.apache.camel.springboot</groupId>        <artifactId>camel-jackson-starter</artifactId>        <version>3.21.0</version>    </dependency>    <dependency>        <groupId>org.apache.camel.springboot</groupId>        <artifactId>camel-swagger-java-starter</artifactId>        <version>3.21.0</version>    </dependency>    <dependency>        <groupId>org.apache.camel.springboot</groupId>        <artifactId>camel-spring-boot-starter</artifactId>        <version>3.21.0</version>    </dependency>        <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>    </dependency></dependencies>
3. 主要类

让我们首先创建一个 Spring Boot应用程序

@SpringBootApplication@ComponentScan(basePackages="com.baeldung.camel")public class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }}
4. Spring Boot的Camel配置

现在让我们用 Spring 配置我们的应用程序,从配置文件(properties)开始。

例如,让我们在 src/main/resources 中的 application.properties 文件中为我们的应用程序配置一个日志:

logging.config=classpath:logback.xmlcamel.springboot.name=MyCamelserver.address=0.0.0.0management.address=0.0.0.0management.port=8081endpoints.enabled = trueendpoints.health.enabled = true

此示例显示application.properties文件,该文件还设置了 Logback 配置的路径。通过将 IP 设置为 “0.0.0.0”,我们完全限制了 Spring Boot提供的 Web 服务器上的管理员和管理访问权限。此外,我们还支持对应用程序终端节点以及运行状况检查终端节点进行所需的网络访问。

另一个配置文件是 application.yml。在其中,我们将添加一些属性来帮助我们将值注入到应用程序路由中:

server:  port: 8080camel:  springboot:    name: ServicesRestmanagement:  port: 8081endpoints:  enabled: false  health:    enabled: truequickstart:  generateOrderPeriod: 10s  processOrderPeriod: 30s
5.设置 Camel Servlet

开始使用Camel的一种方法是将其注册为servlet,这样它就可以拦截HTTP请求并将它们重定向到我们的应用程序。

application.yml 中定义一个 URL 参数。稍后它将被注入到我们的 Java 代码中:

baeldung:  api:    path: '/camel'

回到我们的 Application 类,我们需要在上下文路径的根目录中注册 Camel servlet,当应用程序启动时,它将从 application.yml 中把 baeldung.api.path 注入:

@Value("${baeldung.api.path}")String contextPath;@BeanServletRegistrationBean servletRegistrationBean() {    ServletRegistrationBean servlet = new ServletRegistrationBean      (new CamelHttpTransportServlet(), contextPath+"/*");    servlet.setName("CamelServlet");    return servlet;}

从 Camel 的 2.19 版本开始,此配置已被删除,因为 CamelServlet 默认设置为“/camel”。

6. 建立路由

让我们通过从 Camel 扩展 RouteBuilder 类并将其设置为@Component来开始创建路由,以便组件扫描例程可以在 Web 服务器初始化期间找到它:

@Componentclass RestApi extends RouteBuilder {    @Override    public void configure() {        CamelContext context = new DefaultCamelContext();                restConfiguration()...        rest("/api/")...         from("direct:remoteService")...    }}

在此类中,我们覆盖了 Camel 的 RouteBuilder 类中的 configure() 方法。Camel总是需要一个CamelContext实例 - 保存传入和传出消息的核心组件。

在这个简单的示例中,DefaultCamelContext 就足够了,因为它只是将消息和路由绑定到其中,就像我们将要创建的 REST 服务一样。

6.1.restConfiguration()路由

接下来,我们为计划在 restConfiguration() 方法中创建的端点创建一个 REST 声明:

restConfiguration()  .contextPath(contextPath)   .port(serverPort)  .enableCORS(true)  .apiContextPath("/api-doc")  .apiProperty("api.title", "Test REST API")  .apiProperty("api.version", "v1")  .apiContextRouteId("doc-api")  .component("servlet")  .bindingMode(RestBindingMode.json)

在这里,我们使用 YAML 文件中注入的属性注册上下文路径。同样的逻辑也应用于我们应用程序的端口。已启用 CORS,允许跨站点使用此 Web 服务。绑定模式允许将参数转换为我们的 API。

接下来,我们将 Swagger 文档添加到我们之前设置的 URI、标题和版本中。当我们为 REST Web 服务创建方法/端点时,Swagger 文档将自动更新。

这个 Swagger 上下文本身就是一条 Camel 路由,我们可以在启动过程中在服务器日志中看到有关它的一些技术信息。默认情况下,我们的示例文档在 提供

6.2.rest()路由

现在,让我们从上面列出的 configure() 方法实现 rest()方法调用:

rest("/api/")  .id("api-route")  .consumes("application/json")  .post("/bean")  .bindingMode(RestBindingMode.json_xml)  .type(MyBean.class)  .to("direct:remoteService");

对于那些熟悉 API 的人来说,这种方法非常简单。idCamelContext 中路由的标识。下一行定义 MIME 类型。这里定义了绑定模式,以表明我们可以在 restConfiguration() 上设置一个模式。

post() 方法向 API 添加一个操作,生成一个“POST /bean”端点,而 MyBean(具有整数 id字符串名称的常规 Java Bean)定义了预期的参数。

类似地,诸如 GET、PUT 和 DELETE 之类的 HTTP 操作也可以以 get()、put()、delete() 的形式使用。

最后,to()方法创建到另一条路由的桥。在这里,它告诉Camel在其上下文/引擎中搜索我们将要创建的另一个路由 - 该路由由值/ id“direct:...”命名和检测,与from()方法中定义的路由匹配。

6.3. 带有transform() 的from()路由

使用 Camel 时,路由接收参数,然后转换和处理这些参数。之后,它将这些参数发送到另一个路由,该路由将结果转发到所需的输出(文件、数据库、SMTP 服务器或 REST API 响应)。

在本文中,我们只在要覆盖的 configure() 方法中创建另一个路由。它将是我们最后一个 to() 路由的目的地路由:

from("direct:remoteService")  .routeId("direct-route")  .tracing()  .log(">>> ${body.id}")  .log(">>> ${body.name}")  .transform().simple("Hello ${in.body.name}")  .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(200));

from() 方法遵循与 rest() 方法相同的原则,并且具有许多相同的方法,只是它从 Camel 上下文消息中使用。这就是参数“direct-route”的原因,它创建了一个指向上述方法rest().to()的链接。

还有许多其他转换可用,包括提取为Java对象并将其发送到持久性层。请注意,路由始终从传入消息中读取,因此链接的路由将忽略传出消息。

我们的例子已经准备好了,我们可以尝试一下:

运行提示命令:mvn spring-boot:run使用 POST 请求 ,请求头中设置Content-Type: application/json,以及参数:{“id”: 1,”name”: “World”}我们应该收到返回代码 201 和响应:Hello, World6.4. 简单的脚本语言

该示例使用 tracecing() 方法输出日志记录。请注意,我们使用了 ${} 占位符;这些是属于Camel的脚本语言的一部分,称为SIMPLE。它应用于通过路由交换的消息,例如消息中的正文。

在我们的示例中,我们使用 SIMPLE 将 Camel 消息正文中的 bean 属性输出到日志中。我们也可以使用它来做简单的转换,如 transform() 方法所示。

6.5.from() 路由与process()

让我们做一些更有意义的事情,例如调用服务层来返回处理后的数据。SIMPLE 不适用于繁重的数据处理,所以让我们用 process() 方法替换 transform():

from("direct:remoteService")  .routeId("direct-route")  .tracing()  .log(">>> ${body.id}")  .log(">>> ${body.name}")  .process(new Processor() {      @Override      public void process(Exchange exchange) throws Exception {          MyBean bodyIn = (MyBean) exchange.getIn().getBody();          ExampleServices.example(bodyIn);          exchange.getIn().setBody(bodyIn);      }  })  .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(200));

这允许我们将数据提取到一个 bean,与之前在 type() 方法上定义的相同,并在我们的 ExampleServices 层中处理它。

由于我们之前将 bindingMode() 设置为 JSON,因此响应已经采用正确的 JSON 格式,基于我们的 POJO 生成。这意味着对于示例服务类:

public class ExampleServices {    public static void example(MyBean bodyIn) {        bodyIn.setName( "Hello, " + bodyIn.getName() );        bodyIn.setId(bodyIn.getId() * 10);    }}

相同的 HTTP 请求现在返回响应代码 201和正文:{“id”: 10,“name”: “Hello, World”}

7. 结论

通过几行代码,我们设法创建了一个相对完整的应用程序。所有依赖项都通过单个命令自动构建、管理和运行。此外,我们可以创建将各种技术结合在一起的 API。

这种方法对容器也非常友好,从而产生了一个非常精简的服务器环境,可以根据需要轻松复制。额外的配置可能性可以很容易地合并到容器模板配置文件中。

最后,除了 filter()、process()transform() marshall() API 之外,Camel 中还提供了许多其他集成模式和数据操作。

标签: #apachespring官网下载 #apachecamelbean #apachecamel高级教程 #apachecamel文档 #apachecamel规则设置