我在学习 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中有些东西对我不起作用,日志没有告诉我任何信息,所以我想知道如何正确调试它。
答案很简单。
在camel中,你可以使用多种类型的
DSL
正如您所提到的,
routeId
始终是必要的,因为Camel
作为Enterprise Integration
框架,需要在Camel上下文中识别路由以用于多种目的,例如监控、日志记录和跟踪。
如果您添加像
hawtio
这样的库,您可以检查 UI
,其中包含有关您的路线的更多详细信息,例如在启动应用程序时,哪条路线启动了,哪条路线没有启动。
请记住,
Camel
有很多组件,例如JMS队列之类的组件,它们必然需要routeId来跟踪和实现重试机制或死信队列等机制,并且它们可以组合在一起,还有sftp端点之类的东西,有时会发生冲突,有些路线开始,有些不开始,你可能必须调查发生了什么等等..
我建议您阅读有关企业集成模式的更多详细信息,以获得更大的了解。