我使用以下用例在Camel上割牙:
鉴于GitHub用户名,我想获取一定数量的公共用户名 以活动的降序排列,然后为我想要的每个回购 获取一定数量的提交,最后,对于每次提交,我 想要打印一些信息。
为实现这一目标,我写了Producer
以及以下路线。生产者工作(我测试),没有聚合器的路线也是如此。使用聚合器时,没有任何结果(我的测试失败)。
public void configure() throws Exception {
from("direct:start")
.id("gitHubRoute")
.filter(and(
isNotNull(simple("${header." + ENDPOINT + "}")),
isNotNull(simple("${body}")))
)
.setHeader(USERNAME, simple("${body}"))
.toD("github:repos?username=${body}")
.process(e -> {
// some processing
})
.split(body())
.parallelProcessing()
.setHeader(REPO, simple("${body.name}"))
.toD("github:commits" +
"?repo=${body.name}" +
"&username=${header." + USERNAME + "}"
)
.process(e -> {
// some processing
})
.split(body())
.toD("github:commit" +
"?repo=${header." + REPO + "}" +
"&username=${header." + USERNAME + "}" +
"&sha=${body.sha}"
)
.process(e -> {
// some processing
})
.aggregate(header(REPO), new GroupedExchangeAggregationStrategy()).completionTimeout(10000l)
.toD("${header." + ENDPOINT + "}");
from("direct:end")
.process().exchange(this::print);
}
在测试期间,我将标头ENDPOINT
设置为mock:result
。实际上,它设置为direct:end
。
我做错了什么?没有错误,但永远不会调用print
方法或测试期间的模拟。
答案 0 :(得分:0)
我自己解决了。我要改变的一些事情:
completionPredicate
,如下所示。eagerCheckCompletion()
:如果没有这个,传递到completionPredicate
的交换是汇总交易所,而不是传入的交易所。我也借此机会进行了一些重构,以提高可读性。
public void configure() throws Exception {
from("direct:start")
.id("usersRoute")
.filter(isNotNull(simple("${header." + ENDPOINT + "}")))
.setHeader(USERNAME, simple("${body}"))
.toD("github:users/${body}/repos")
.process(e -> this.<GitHub.Repository>limitList(e))
.to("direct:reposRoute1");
from("direct:reposRoute1")
.id("reposRoute1")
.split(body())
.parallelProcessing()
.setHeader(REPO, simple("${body.name}"))
.toD("github:repos/${header." + USERNAME + "}" + "/${body.name}/commits")
.process(e -> this.<GitHub.Commit>limitList(e))
.to("direct:reposRoute2");
from("direct:reposRoute2")
.id("reposRoute2")
.split(body())
.toD("github:repos/${header." + USERNAME + "}" + "/${header." + REPO + "}" + "/commits/${body.sha}")
.process(e -> {
GitHub.Commit commit = e.getIn().getBody(GitHub.Commit.class);
List<GitHub.Commit.File> files = commit.getFiles();
if (!CollectionUtils.isEmpty(files) && files.size() > LIMIT) {
commit.setFiles(files.subList(0, LIMIT));
e.getIn().setBody(commit);
}
})
// http://camel.apache.org/aggregator2.html
.aggregate(header(REPO), new AggregateByRepoStrategy())
.forceCompletionOnStop()
.eagerCheckCompletion()
.completionPredicate(header("CamelSplitComplete").convertTo(Boolean.class).isEqualTo(TRUE))
.toD("${header." + ENDPOINT + "}");
from("direct:end")
.process().exchange(this::print);
}
我使用的AggregationStrategy
如下:
private static final class AggregateByRepoStrategy extends AbstractListAggregationStrategy<GitHub.Commit> {
@Override
public GitHub.Commit getValue(Exchange exchange) {
return exchange.getIn().getBody(GitHub.Commit.class);
}
}