Apache Camel:使用自定义处理器,分离器和聚合器的路由不输出任何内容

时间:2017-06-26 08:47:53

标签: apache-camel

我使用以下用例在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方法或测试期间的模拟。

1 个答案:

答案 0 :(得分:0)

我自己解决了。我要改变的一些事情:

  1. 完成检查:我使用了completionPredicate,如下所示。
  2. eagerCheckCompletion():如果没有这个,传递到completionPredicate的交换是汇总交易所,而不是传入的交易所。
  3. 我也借此机会进行了一些重构,以提高可读性。

    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);
        }
    }