routes - Apache camel、负载均衡器和暂停的路由
问题描述
对 apache camel 来说相当陌生,所以如果我做错了什么,我不会感到惊讶。我遇到问题的概念验证应用程序是使用 apache camel 3.3 和 spring boot,其目的是使用循环策略将发布请求的主体发送到不同目录中的文件。因此,我添加了以下 RouteBuilder 类
package demo.camel;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
@Component
public class MyRouteBuilder extends RouteBuilder {
@Override
public void configure() {
from("direct:in").routeId("first")
.loadBalance()
.failover(1, true, true)
.to("direct:final-1", "direct:final-2");
from("direct:final-1").routeId("file1").to("file://src/output/file1.txt");
from("direct:final-2").routeId("file2").to("file://src/output/file2.txt");
}
}
我要做的下一件事(并且遇到问题)是暂停路由并检查负载均衡器是否忽略了暂停的路由。设法暂停路由(日志消息表明路由已暂停和停止),但负载均衡器仍在尝试将请求推送到暂停的路由,30 秒后失败并移动到第二条路由。故障转移并尝试第二条路线很好,但仍在尝试暂停的路线不是很好。这是我的 FileMoverController (我知道我应该暂停来自不同线程的路由,但不要认为这是我的问题的原因)
package demo.camel;
import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.impl.engine.DefaultRoute;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/content")
public class ContentMoverController {
private CamelContext context;
private ProducerTemplate producerTemplate;
@Autowired
public ContentMoverController(CamelContext context){
this.context = context;
producerTemplate = context.createProducerTemplate();
}
@PostMapping("/txt")
public String moveContent(@RequestBody KeyValueRequest keyValueRequest) throws Exception{
context.getRouteController().suspendRoute("file1");
DefaultRoute route = (DefaultRoute) context.getRoute("file1");
route.suspend();
producerTemplate.requestBody("direct:in", keyValueRequest.toString());
return "ok";
}
}
记录消息
2021-07-08 09:26:09.901 INFO 88995 --- [0.0-8080-exec-1] o.a.c.i.engine.DefaultShutdownStrategy : Starting to graceful suspend 1 routes (timeout 45 seconds)
2021-07-08 09:26:09.912 INFO 88995 --- [ - ShutdownTask] o.a.c.i.engine.DefaultShutdownStrategy : Route: file1 suspend complete, was consuming from: direct://final-1
2021-07-08 09:26:09.916 INFO 88995 --- [0.0-8080-exec-1] o.a.c.i.engine.DefaultShutdownStrategy : Graceful shutdown of 1 routes completed in 0 seconds
2021-07-08 09:26:09.917 INFO 88995 --- [0.0-8080-exec-1] o.a.c.impl.engine.AbstractCamelContext : Route: file1 is suspended, was consuming from: direct://final-1
2021-07-08 09:27:08.048 ERROR 88995 --- [0.0-8080-exec-1] o.a.c.p.e.DefaultErrorHandler : Failed delivery for (MessageId: ID-gogal-1625732798027-0-1 on ExchangeId: ID-gogal-1625732798027-0-1). Exhausted after delivery attempt: 1 caught: org.apache.camel.component.direct.DirectConsumerNotAvailableException: No consumers available on endpoint: direct://final-1. Exchange[ID-gogal-1625732798027-0-1]
Message History (complete message history is disabled)
---------------------------------------------------------------------------------------------------------------------------------------
RouteId ProcessorId Processor Elapsed (ms)
[first ] [first ] [from[direct://in] ] [ 30049]
...
[first ] [to1 ] [direct:final-1 ] [ 0]
这使我认为我没有正确理解文档。所以我正在接触世界,有人知道我做错了什么吗?有没有办法暂停负载均衡器的路由?
解决方案
推荐阅读
- java - Java同步死锁?
- php - Laravel 5.6 模型扩展了其他模型
- node.js - ExpressJS 和 NodeJS 中 Mongoose 的响应对象中的排序键
- python - 为什么 SendGrid 允许我从任何地址发送电子邮件?
- python - Gamma 随机数、MATLAB 和 Python
- javascript - Angular 6,类变量在完成之前不会从(更改)调用的方法内部更新
- sql-server-2014 - 使用 %%lockres%% 函数看不到任何结果
- mongodb - MongoDB中的事务锁
- javascript - 在 Chrome 上的开发人员控制台中使用“require”运行 JavaScript
- nsis - 将 HKLM/HKCU 分配给不同类型安装的变量