Apache 骆驼路线不调用另一个骆驼路线

Apache camel route not calling another camel route

我有三个骆驼路线 运行 单独很好,我试图在第一条路线完成后调用第二条路线,但有些事情如何没有启动第三条路线事件如何 运行 一次我使用 URL jetty:http://localhost:8181/mongoSelect 调用第二条路线,我在控制台上也没有错误。我已经尝试用 direct: 组件更改 from("jetty:http://localhost:8181/mongoSelect"),请帮助我。

常量

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) 的响应数据,但是如果我在第二条路线中使用 from("jetty: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();

试试这个。这应该有效。

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

您似乎被卡住了,这里有一些建议可以帮助您继续前进。

  • 您的第一条路线从文件读取并写入 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 所建议的那样。但是你还有其他问题:

  • 你写道,如果你使用 direct:mongoSelect,你会得到 没有 mongodb-results。这可能是因为来自第一条路由的消息正文仍然存在,因此用作 mongodb.
  • 的查询字符串
  • 在从数据库中读取
  • 之前,将消息正文设置为.setBody()正确

如果 QUERY_MONGO_DB 中的 mongodb-query 要阅读整个合集,请使用 .setBody(constant("")).setBody([your mongodb-query]) 如果您想阅读特定内容。

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

最后,出于完整性考虑,您写道,如果您将 HTTP 端点用于第二条路由,您会从 mongo-db 获得结果。我猜你用 GET 请求调用了第二条路由,因此消息的主体是空的。这意味着您从 mongo-db.

取回了整个集合