1

我在我的项目中做 Apache Camel PoC。使用 Camel JDBC 组件时,我遇到了一个问题。

我可以使用 JDBC 组件从数据库中读取数据。但我需要始终使用 Timer 组件。根据 Camel 文档,JDBC 组件不能在 from() 语句中使用。我尝试在文档中给出的 from() 语句中使用 Direct 组件,但它不起作用。

下面是我的代码:

from("direct:zh_ICS_Test")
//from("timer://myTimer?period=2s")
  .setBody(constant("select * from ZH_ICS_TEST"))
  .to("jdbc:myDataSource")
  .split(body())
  .convertBodyTo(String.class)
  .to("file://" + dst);

下面是控制台输出:

[main] INFO org.apache.camel.impl.DefaultCamelContext - Apache Camel 2.12.1 (CamelContext: camel-1) 正在启动 [main] INFO org.apache.camel.management.ManagedManagementStrategy - JMX 已启用 [main] INFO org .apache.camel.impl.converter.DefaultTypeConverter - 已加载 176 个类型转换器 [main] INFO org.apache.camel.impl.DefaultCamelContext - StreamCaching 未使用。如果使用流,则建议启用流缓存。在http://camel.apache.org/stream-caching.html查看更多细节[main] INFO org.apache.camel.impl.DefaultCamelContext - 路由:route1 开始并使用:Endpoint[direct://zh_ICS_Test] [main] INFO org.apache.camel.impl.DefaultCamelContext - 共有 1 条路由,其中1 开始。[main] INFO org.apache.camel.impl.DefaultCamelContext - Apache Camel 2.12.1 (CamelContext: camel-1) 在 0.798 秒内启动 [main] INFO org.apache.camel.impl.DefaultCamelContext - Apache Camel 2.12.1 ( CamelContext:camel-1) 正在关闭 [main] INFO org.apache.camel.impl.DefaultShutdownStrategy - 开始正常关闭 1 路由(超时 300 秒)[Camel (camel-1) thread #1 - ShutdownTask] INFO org. apache.camel.impl.DefaultShutdownStrategy - 路由:route1 关闭完成,从端点 [direct://zh_ICS_Test] [main] INFO org.apache.camel.impl 消费。

如果我使用 Timer 而不是 Direct 组件,则上面的代码有效。我不想总是使用 Timer,只需要执行一次我的查询。我正在使用带有 JDK7 的 Camel 2.12.1。

有人可以帮忙吗?

4

2 回答 2

2

你描述的行为是正常的。您只有一条带有direct componentfor the from 的路线。

在这种情况下,除非您以编程方式将 Exchange 发送到该直接组件,否则不会发生任何事情。

看看骆驼医生怎么说:

当生产者发送消息交换时,direct: 组件提供对任何消费者的直接、同步调用。此端点可用于连接相同骆驼上下文中的现有路由。

于 2013-11-18T07:06:14.303 回答
0

这是意料之中的,因为该路由没有收到任何会触发它的入站交换来消费。

使用计时器组件时,不需要交换,因为它是由组件生成的:

timer: 组件用于在计时器触发时生成消息交换。您只能使用来自此端点的事件。

如果你想坚持下去,direct:你必须以某种方式发送交换to("direct:zh_ICS_Test")

您可以使用任何端点来触发它:

from("...").to("direct:zh_ICS_Test");

如果您计划定期运行您的路线,您可以使用Quartz 组件来执行此操作(请阅读文档以了解实现细节):

from("quartz://myGroup/myTimerName?trigger.repeatInterval=2000&trigger.repeatCount=5").to("direct:zh_ICS_Test");
于 2013-11-18T08:02:21.313 回答