Quarkus Camel 使用 (二)

199 阅读2分钟

Quarkus Camel 使用 (二)


​ 首先,需要创建一个基于Quarkus的应用程序,并添加Quarkus Camel扩展。

场景1:

从文件夹读取文件并将内容输出到控制台

实现步骤:

  • 使用file组件读取指定的文件夹
  • 使用log组件将读取到的文件内容输出到控制台

添加依赖

<dependency>  
<groupId>org.apache.camel.quarkus</groupId>  
<artifactId>camel-quarkus-file</artifactId>  
</dependency>  

添加路由类

FileRoute

@ApplicationScoped  
@RegisterForReflection  
public class FileRoute extends RouteBuilder {  
@Override  
public void configure() throws Exception {  
from("file://data/input/?noop=true")  
.routeId("file-route")  
.log("${body}");  
}  
}  

使用了from("file://data/input?noop=true")来从data/input文件夹中读取文件。noop=true表示不删除已经读取的文件。然后,我们将文件内容使用log()输出到控制台。

添加数据并启动项目

image-20230426155520023

场景2:

还有种场景在实际项目中非常常见。
许多应用程序都需要集成多个服务或系统,这可能涉及到与外部API进行通信、将数据转换为不同的格式,或将数据传输到其他系统或服务。
使用Quarkus Camel框架可以使这个过程更加容易和可靠。

添加依赖

<dependency>  
<groupId>org.apache.camel.quarkus</groupId>  
<artifactId>camel-quarkus-http</artifactId>  
</dependency>  
<dependency>  
<groupId>org.apache.camel.quarkus</groupId>  
<artifactId>camel-quarkus-jsonpath</artifactId>  
</dependency>  

添加路由类

@ApplicationScoped  
@RegisterForReflection  
public class HttpRoute extends RouteBuilder {  
  
@Override  
public void configure() throws Exception {  
from("timer://myTimer?period=5000")  
.to("http://parkinglot.xxxxxxx-tech.com/Parking/Handheld/GetParkingLotInfo")  
.unmarshal().json(true)  
.log("${body}");  
}  
}  
  

在 configure() 方法中,通过 from("timer://myTimer?period=5000") 创建一个定时器触发器,每 5000 毫秒执行一次路由。然后通过 to("parkinglot.xxxxxx-tech.com/Parking/Han…") 发送一个 HTTP GET 请求到指定的 URL,获取该接口返回的数据。接下来,使用 .unmarshal().json(true) 将返回的 JSON 数据反序列化为 Java 对象,并通过 .log("${body}") 将结果打印到日志中。

👇 控制台日志 :

INFO [route7] (Camel (camel-1) thread #2 - timer://myTimer) {resCode=0, resMsg=Park parking lot, totalNum=1000, totalStopNum=439, totalRemainNum=561, parkingLotInfo=[{parkingLotId=1, parkingLotName=Park parking lot No:1, totalNum=1000, totalStopNum=439, totalRemainNum=561}]}  

改造1

@ApplicationScoped  
@RegisterForReflection  
public class HttpRoute extends RouteBuilder {  
  
public void configure() throws Exception {  
from("timer://myTimer?period=5000")  
.to("http://parkinglot.xxxxx-xxxx.com/Parking/Handheld/GetParkingLotInfo")  
.unmarshal().json(true)  
.enrich("direct:extractData")  
.log("内容为:${header.Data}");  
  
  
from("direct:extractData")  
.process(exchange -> {  
// 拿值  
String partyId = "TEST_Party" + exchange.getIn().getBody(JsonObject.class).getString("totalStopNum").toString();  
// 定义值  
String partyTypeId = "PERSON";  
// 拿值  
String partyName = "TEST_Party" + exchange.getIn().getBody(JsonObject.class).getString("totalRemainNum").toString();  
  
JsonObject json = new JsonObject()  
.put("partyId", partyId)  
.put("partyTypeId", partyTypeId)  
.put("partyName", partyName);  
  
exchange.getIn().setHeader("Data", json.toString());  
});  
}  
}  

每隔5秒钟调用远程的HTTP接口获取停车场信息,然后将结果解析成JSON格式。接着通过enrich()方法将获取到的停车场信息与另外一个路由中处理的数据进行合并,合并的方式是将两个JSON对象中的属性合并到一个新的JSON对象中。最后将合并后的数据打印出来。
其中,from("timer://myTimer?period=5000")表示每隔5秒钟执行一次任务;to("parkinglot.xxxxxx-tech.com/Parking/Han…

👇 控制台日志 :

INFO [route71] (Camel (camel-9) thread #18 - timer://myTimer) 内容为:{"partyId":"TEST_Party472","partyTypeId":"PERSON","partyName":"TEST_Party528"}