首页 > 解决方案 > 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]


这使我认为我没有正确理解文档。所以我正在接触世界,有人知道我做错了什么吗?有没有办法暂停负载均衡器的路由?

标签: routesapache-camelload-balancingsuspend

解决方案


推荐阅读