1

我有三个骆驼路线单独运行良好,我试图在第一条路线完成后调用第二条路线,但是一旦我使用 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),但是如果我使用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();
4

2 回答 2

1

尝试这个。这应该有效。

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();
于 2018-03-27T09:17:36.923 回答
1

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

  • 您的第一条路线从文件中读取并写入 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 的查询字符串。
  • 在从数据库中读取之前,请正确设置您的消息正文.setBody()

如果 shold 中的 mongodb-queryQUERY_MONGO_DB读取整个集合.setBody(constant("")),或者.setBody([your mongodb-query])您想读取特定内容。

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

最后,为了完整起见,您写道,如果您将 HTTP 端点用于第二条路由,您将从 mongo-db 获得结果。我猜您使用 GET 请求调用了第二条路由,因此该消息的正文为空。这意味着你从 mongo-db 取回了整个集合。

于 2018-03-28T05:49:20.717 回答