【问题标题】:Apache camel route not calling another camel routeApache骆驼路线不调用另一条骆驼路线
【发布时间】:2018-09-05 11:59:11
【问题描述】:

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

【问题讨论】:

  • 什么是目的地?
  • @pvpkiran DESTINATION 是一个 URI 常量,问题已更新,请查看。
  • 在您的第一条路线完成后?你怎么称呼你的第二条路线?我没看到
  • 我确实尝试使用.to("direct:mongoSelect") 将控件发送到第二条路线,但它对我不起作用。
  • 你能把那部分代码放上去吗

标签: routes apache-camel enterprise-integration


【解决方案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();

【讨论】:

  • 在控制台org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: com.mongodb.WriteResult to the required type: java.io.InputStream with value WriteResult{n=0, updateOfExisting=false, upsertedId=null}得到这个异常
  • 这和数据类型转换有关。你需要照顾它。路由现在被调用了吗?
  • 是的,它正在被调用,但是我不想使用jetty:http://localhost:8181/mongoSelect,因为所有三个路由都在同一个类中。不是使用 direct: 之类的组件调用的方法
  • 不明白你在问什么
  • 我的意思是,我不想使用 rest-api 调用来访问第二条路线。有没有其他方法可以访问它,比如direct:组件用于控制转移。
【解决方案2】:

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

  • 您的第一个路由从文件读取并写入 mongo-db
  • 最初,它没有调用第二条路由

如果要求第二个路由是一个HTTP服务,它在http://localhost:8181/mongoSelect进行监听并且你的第一个路由应该调用它,那么第一个路由必须调用同一个网址。

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

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

  • 你写道,如果你使用direct:mongoSelect,你会得到no 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 取回了整个集合。

【讨论】:

  • @buki 是的,我的要求是,使用第一条路线将文件内容存储在 mongodb 中,工作正常,第二条路线我必须从 mongodb 读取数据,这正是问题所在,我不必使用 HTTP。我试过你的第二种方法from("direct:mongoSelect") .setBody("") .to(QUERY_MONGO_DB).setBody("") 有一个编译时异常说The method setBody(Expression) in the type ProcessorDefinition&lt;RouteDefinition&gt; is not applicable for the arguments (String)
  • 抱歉,试试.setBody(constant("")) 或 .setBody(constant(null))。我不知道空字符串或 null 是否对 mongodb 有影响。我也更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2020-05-13
  • 2016-12-21
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
相关资源
最近更新 更多