gpt4 book ai didi

java - Camel : How to build a route conditionally from configuration?

转载 作者:行者123 更新时间:2023-11-30 02:58:46 25 4
gpt4 key购买 nike

我有一个 RouteBuilder 子类,用于设置我的 Camel 路线。它是由 Spring 构建的。最初它看起来像这样:

@Override
public void configure() throws Exception {
from(...)
.process(...)
.to(...)
}

我想做的是根据配置添加额外的端点路由。 Spring 使用一个属性文件来创建 RouteBuilder bean,它设置的字段之一是 boolean addAnotherEndpoint。如果这个 boolean 值为真,我想添加另一个。如果它是假的,我希望它恢复到当前的行为。所以我把它改成这样:

@Override
public void configure() throws Exception {
from(...)
.process(...)
.to(...)
.choice()
when(constant(addAnotherEndpoint)).to(...)
.endChoice();
}

虽然这似乎具有所需的行为,但我在为其编写单元测试时遇到了问题(因为它从属性文件中提取 addAnotherEndpoint 的值,即使我试图在我的测试)。有更好的方法来处理这个问题吗?我当前的方法会产生任何意想不到的副作用吗?

编辑:

我正在使用 CamelSpringTestSupport 子类进行测试(使用 JUnit 测试)。在 @Before 方法中,我创建了一个 AdviceWithRouteBuilder 来用模拟替换所有端点。在我的 @Test 中,我尝试覆盖从 Properties 文件获取的 addAnotherEndpoint 的值:

@Test
public void testConditionalRouting() throws Exception {
context.start();
MyRouteBuilder routeBuilder = (MyRouteBuilder) applicationContext.getBean("myRouteBuilder");
routeBuilder.setAddAnotherEndpoint(true);
getMockEndpoint("myMockEndpoint").expectedMessageCount(1);
sendMockMessage();
assertMockEndpointsSatisfied();
context.stop();
}

有一个相应的测试,将 addAnotherEndpoint 设置为 false 并断言收到了 0 条消息。问题是覆盖这个变量的值似乎不起作用。一个测试通过,另一个测试失败,具体取决于我的属性文件是否指示该值应该为 true 还是 false。这对我来说意味着路线是在我覆盖设置之前构建的(因此也在上下文启动之前)。我检查了调试器,设置正确覆盖。只是似乎没有任何影响。

编辑2:

来 self 的AdviceWithRouteBuilder:

@Override
public void configure() throws Exception {
replaceFromWith(MOCK_FROM_ENDPOINT);
interceptSendToEndpoint(FIRST_TO_ENDPOINT)
.skipSendToOriginalEndpoint().to(MOCK_FIRST_TO_ENDPOINT);
weaveById(MY_PROCESSOR_ENDPOINT).replace()
.to(MOCK_MY_PROCESSOR_ENDPOINT);
weaveById(SECOND_TO_ENDPOINT).replace()
.to(MOCK_SECOND_TO_ENDPOINT);
}

这会将每个 EIP 替换为模拟端点。我有 4 个依赖于这些的测试,它们似乎按预期工作,唯一的问题是条件路由。

除了 JUnit 注释之外,我的测试类上唯一的注释是 isUseAdviceWith() 上的 @Override(返回 true)和 createApplicationContext(),它返回一个新的 Spring 应用程序上下文。

我在没有 context.start() 的情况下运行了测试,唯一通过的测试是断言收到 0 条消息的测试(如果路由未启动,则这是有意义的)。所以我不相信上下文是自动启动的。

最佳答案

这是最终的工作结果:

我的测试很好,但我必须重新考虑如何构建我的路线。发生的事情是在创建 Spring 上下文时,正在构建路线。它检查了当时 addAnotherEndpoint 的值,并根据该值设置了constant。但是boolean是一个原始值,这意味着它是按值传递的。为什么这很重要?因为 constant() 函数只是根据构建路由时该常量的值来设置路由。稍后通过 Spring 更改它没有任何影响,因为该值已经被读取。我需要做的是让它传递一个对象作为谓词,这样我以后就可以将同一个对象作为 bean 进行操作。

此外,我按照建议从 choice() 更改为 filter()。这是成品:

@Override
public void configure() throws Exception {
from(...)
.process(...)
.to(...)
.choice()
when(myBooleanPredicate).to(...)
.endChoice();
}

以及我的自定义谓词,可以通过 Spring 进行操作:

public class BooleanPredicate implements Predicate {
private boolean value;

@Override
public boolean matches(Exchange exchange) {
return value;
}

public void setValue(boolean value) {
this.value = value;
}

BooleanPredicate的内部设置为addAnotherPredicate。由于 BooleanPredicate 是通过引用传递的,因此每次运行路由时都会重新读取它。

关于java - Camel : How to build a route conditionally from configuration?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36484884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com