Apache Camel - 如何正确调试路由

问题描述 投票:0回答:1

我在学习 Apache Camel 时遇到了一些问题。

我试图使用 jetty 和 Rest DSL 创建一个非常简单的休息服务,如下所示:

package org.examples.routes.camelRestRoute;

import org.apache.camel.builder.RouteBuilder;

public class CamelRestRouteBuilder extends RouteBuilder {
    @Override
    public void configure()  {

        restConfiguration()
                .component("jetty")
                .host("localhost")
                .port(8091);

        rest("/api")
            .get("/hello")
            .to("direct:helloWorld");

        from("direct:helloWorld")
                .transform().simple("Hello, world");
    }
}

不幸的是,它不起作用。当我在此端点上调用curl 时,我收到了HTTP 500 错误,浏览器也出现了同样的情况。但是当我的程序运行时端口是打开的(用netstat检查)。我在 apache Camel 中启用了跟踪,

main.configure().setTracing(true);
,但即使更多日志确实以这种方式显示,当我发出 http 请求时,日志中根本没有显示任何错误。

我搜索了很多地方都找不到问题所在,直接来自 Apache Camel Documentation的示例也不起作用。最后,我在 Stack Overflow上找到了一个正在运行的示例,逐行注释掉以查看我没有的必要内容,结果是命名我的直接路由 .routeId("Hello World! ”)至关重要。所以现在代码看起来像这样:

package org.examples.routes.camelRestRoute;

import org.apache.camel.builder.RouteBuilder;

public class CamelRestRouteBuilder extends RouteBuilder {
    @Override
    public void configure()  {

        restConfiguration()
                .component("jetty")
                .host("localhost")
                .port(8091);

        rest("/api")
            .get("/hello")
            .to("direct:helloWorld");

        from("direct:helloWorld")
                .routeId("helloWorld") // this is changed
                .transform().simple("Hello, wolrd");

    }


}

所以我的问题基本上是 - 我怎么知道这一点?有一段关于 Inline Rest DSL 作为单一路线,但此信息在哪里?在这里?

为此,您必须使用直接端点,并且每个端点对于每个服务都必须是唯一的名称。

名字不是自动生成的吗?后来在参数说明中,改为这样写:

rest-dsl 中的内联路由使用直接端点链接。默认情况下,Rest DSL 中的每个服务都是一个单独的路由,这意味着每个服务至少有两个路由(rest-dsl 和从rest-dsl 链接的路由)。启用此功能允许 Camel 优化并将其内联为单个路由。但是,这需要使用直接端点**,每个服务必须是唯一的**。该选项默认为 false。

所以连名字都不必是唯一的,但是路线和我的都是唯一的。

如果类似的内容没有出现在日志中,我该如何调试?这不是第一次在camel中有些东西对我不起作用,日志没有告诉我任何信息,所以我想知道如何正确调试它。

java debugging apache-camel
1个回答
0
投票

答案很简单。

在camel中,你可以使用多种类型的

DSL

正如您所提到的,

routeId
始终是必要的,因为
Camel
作为
Enterprise Integration
框架,需要在Camel上下文中识别路由以用于多种目的,例如监控、日志记录和跟踪。

如果您添加像

hawtio
这样的库,您可以检查
UI
,其中包含有关您的路线的更多详细信息,例如在启动应用程序时,哪条路线启动了,哪条路线没有启动。

请记住,

Camel
有很多组件,例如JMS队列之类的组件,它们必然需要routeId来跟踪和实现重试机制或死信队列等机制,并且它们可以组合在一起,还有sftp端点之类的东西,有时会发生冲突,有些路线开始,有些不开始,你可能必须调查发生了什么等等..

我建议您阅读有关企业集成模式的更多详细信息,以获得更大的了解。

© www.soinside.com 2019 - 2024. All rights reserved.