gpt4 book ai didi

java - Apache camel - 如何同步到 "wiretap"?或者只是发送一份交换副本?

转载 作者:搜寻专家 更新时间:2023-10-31 08:17:05 25 4
gpt4 key购买 nike

我有一个正在处理交换主体上的 POJO 的 apache Camel 路线。

请看从 1 到 3 标记的行的顺序。

    from("direct:foo")
.to("direct:doSomething") // 1 (POJO on the exchange body)
.to("direct:storeInHazelcast") // 2 (destroys my pojo! it gets -1)
.to("direct:doSomethingElse") // 3 (Where is my POJO??)
;

现在我需要在 hazelcast 组件上使用 put 操作,不幸的是,它需要将 body 设置为值 -1。

    from("direct:storeInHazelcast")
.setBody(constant(-1))
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.PUT_OPERATION))
.setHeader(HazelcastConstants.OBJECT_ID, constant(LAST_FLIGHT_UPDATE_SEQ))
.to("hazelcast:map:MyNumber")
;

对于标记为 2 的行,我想将交换的 COPY 发送到 storeInHazelcast 路由。

首先,我尝试了 .multicast(),但交换体仍然搞砸了(-1)。

        // shouldnt this copy the exchange?
.multicast().to("direct:storeInHazelcast").end()

然后我尝试了 .wireTap(),它作为“即发即忘”(异步)模式工作,但实际上我需要它来阻止并等待它完成。你能制作 wireTap block 吗?

        // this works but I need it to be sync processing (not async)
.wireTap("direct:storeInHazelcast").end()

所以我在这里寻找一些提示。据我所知,multicast() 应该复制了交换,但是我的 storeInHazelcast 路由中的 setBody() 看起来搞砸了原始交换。

或者,也许还有其他方法可以做到这一点。

提前致谢。 Camel 2.10

最佳答案

我想我已经偶然发现了答案,第 2 行可以像这样使用 dsl 中的 enrich():

    .enrich("direct:storeInHazelcast", new KeepOriginalAggregationStrategy())

哪里:

public class KeepOriginalAggregationStrategy implements AggregationStrategy {
@Override
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
return oldExchange;
}
}

有趣的是,我发现了一个名为 UseOriginalAggregationStrategy() 的聚合策略,但我看不到如何从 DSL 中指定名为 Exchange original 的参数。

    .enrich("direct:storeInHazelcast",
new UseOriginalAggregationStrategy(???, false))

由于 dsl 中缺少某种 getExchange() 方法,我看不到如何在此处使用此聚合策略(但如果有人可以建议如何使用,请这样做)。

关于java - Apache camel - 如何同步到 "wiretap"?或者只是发送一份交换副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20969371/

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