代码之家  ›  专栏  ›  技术社区  ›  Shamim Ahmad

Apache camel路由不调用其他camel路由

  •  1
  • Shamim Ahmad  · 技术社区  · 6 年前

    我有三条骆驼路线可以单独运行,我尝试在第一条路线完成后调用第二条路线,但有些事情是如何启动的,第三条路线在我使用URL调用第二条路线后如何运行 jetty:http://localhost:8181/mongoSelect ,我在控制台上也没有错误。我已经试过换衣服了 from("jetty:http://localhost:8181/mongoSelect") 具有 direct: 组件,请在这方面帮助我。

    常量

    private static final String SOURCE = "file:\\workspace\\EmailResponseAutomationSTS\\response\\?noop=true";
    private static final String DESTINATION = "mongodb:myDb?database=email_response&collection=emailResponse&operation=save";
    private static final String QUERY_MONGO_DB = "mongodb:myDb?database=email_response&collection=emailResponse&operation=findAll";
    

    第一条路线

    from(SOURCE)
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    final EmailResponseModel erm = new EmailResponseModel();
                    erm.setBody(exchange.getIn().getBody(String.class));
                    exchange.getIn().setBody(erm, DBObject.class);
                }
            })
            .to(DESTINATION)
            .end();
    

    第二条路线

    from("jetty:http://localhost:8181/mongoSelect")
            .to(QUERY_MONGO_DB)
            .marshal(new JacksonDataFormat())
            .to("direct:redis")
            .end();
    

    第三条路线

    from("direct:redis").process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
    
                    final String name = exchange.getIn().getBody(String.class);
                    @SuppressWarnings({ "deprecation", "unchecked" })
                    List<BasicDBObject> obj = (List<BasicDBObject>) JSON.parse(name);
    
                    for(BasicDBObject model : obj) {
                        String s = model.getString("body");
                        jedis.set("mongoData", s); 
                    }
                    jedis.close();
                }
            })
            .end();
    

    我已经尝试过这种方法:

    第一条路线

    from(SOURCE)
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    final EmailResponseModel erm = new EmailResponseModel();
                    erm.setBody(exchange.getIn().getBody(String.class));
                    exchange.getIn().setBody(erm, DBObject.class);
                }
            })
            .to(DESTINATION)
            .to("direct:mongoSelect")
            .end();
    

    第二条路线

    from("direct:mongoSelect")
    .to(QUERY_MONGO_DB)
    .marshal(new JacksonDataFormat())
    .to("direct:redis")
    .end();
    

    更新时间: 当我使用从第一条路线调用第二条路线时,我的代码发生了一些奇怪的事情 direct:mongoSelect 组件,控件正在移入,但没有数据响应 .to(QUERY_MONGO_DB) ,但是如果我使用 发件人(“码头:http://localhost:8181/mongoSelect“”) from("direct:mongoSelect") 在第二条路线中,我得到了相应的数据。

    第一条路线

    from(SOURCE)
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    final EmailResponseModel erm = new EmailResponseModel();
                    erm.setEmailBody(exchange.getIn().getBody(String.class));
                    exchange.getIn().setBody(erm, DBObject.class);
                }
            })
            .to(DESTINATION)
            .to("direct:mongoSelect");
    

    第二条路线

    from("direct:mongoSelect")
            .to(QUERY_MONGO_DB)
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    String srt = exchange.getIn().getBody(String.class);
                    exchange.getIn().setBody(srt, DBObject.class);
                }
            })
            .to("direct:redis")
            .end();
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   burki    6 年前

    你似乎被困住了,这里有一些前进的建议。

    • 第一条路由读取文件并写入mongo db
    • 最初是这样的

    如果是 要求 第二条路线是 HTTP服务 http://localhost:8181/mongoSelect 您的第一条路由应该调用它,第一条路由必须调用相同的URL。

    .to(DESTINATION) => Mongo-DB write
    .to("[call to http://localhost:8181/mongoSelect]")
    .end();
    

    但是,如果它不需要是HTTP服务,则端点 direct:mongoSelect 正如@pvpkiran建议的那样,应该可以正常工作。但你还有其他问题:

    • 你写下你得到的 无mongodb结果 如果您使用 直接:mongoSelect
    • 设置您的 消息正文正确 具有 .setBody() 在读取数据库之前

    如果mongodb查询 QUERY_MONGO_DB 应该阅读整个集合使用 .setBody(constant("")) .setBody([your mongodb-query]) 如果你想读一些具体的东西。

    from("direct:mongoSelect")
    .setBody(constant(""))
    .to(QUERY_MONGO_DB)
    

    最后,出于完整性考虑,您写道,如果您将HTTP端点用于第二条路由,那么您将从mongo db获得结果。我猜您使用GET请求调用了第二条路由,因此消息的正文为空。这意味着你从mongo db取回了整个系列。

        2
  •  1
  •   pvpkiran    6 年前

    试试这个。这应该行得通。

    from(SOURCE)
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    final EmailResponseModel erm = new EmailResponseModel();
                    erm.setBody(exchange.getIn().getBody(String.class));
                    exchange.getIn().setBody(erm, DBObject.class);
                }
            })
            .to(DESTINATION)
            .to("direct:mongoSelect")
            .end();
    Second Route
    
    from("direct:mongoSelect")
            .setHeader(Exchange.HTTP_METHOD, constant("GET")) // Change it based on HTTP method type
            .setHeader("Content-Type",simple("application/json"))
            .setHeader("Accept", simple("application/json"))  
            .to("jetty:http://localhost:8181/mongoSelect")
            .to(QUERY_MONGO_DB)
            .marshal(new JacksonDataFormat())
            .to("direct:redis")
            .end();