如何在没有Timer的情况下使用Camel JDBC组件

时间:2013-11-18 06:27:58

标签: java apache-camel camel-jdbc

我在我的项目中正在做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型转换器[主要] INFO   org.apache.camel.impl.DefaultCamelContext - StreamCaching不在   使用。如果使用流,则建议启用流缓存。   在http://camel.apache.org/stream-caching.html [main]查看更多详情   INFO org.apache.camel.impl.DefaultCamelContext - 路由:route1已启动   和消费:端点[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秒内启动   [主要] 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)线程#1 -   ShutdownTask] INFO org.apache.camel.impl.DefaultShutdownStrategy -   路由:route1关闭完成,正在消耗:   端点[direct:// zh_ICS_Test] [main] INFO   org.apache.camel.impl.DefaultShutdownStrategy - 正常关闭1   路线在0秒内完成[主要] INFO   org.apache.camel.impl.DefaultCamelContext - Apache Camel 2.12.1   (CamelContext:camel-1)正常运行时间5.818秒[主要] INFO   org.apache.camel.impl.DefaultCamelContext - Apache Camel 2.12.1   (CamelContext:camel-1)在0.016秒内关闭

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

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您描述的行为是正常的。 您只有一条路线direct component来自。

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

看看骆驼文档说的是什么:

  

direct:组件提供任意的直接,同步调用   生产者发送消息交换时的消费者。这个端点可以   用于连接相同camel上下文中的现有路由。

答案 1 :(得分:0)

这是预期的,因为路由没有接收任何会触发它的入站交换。

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

  

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

如果您想坚持direct:,您必须以某种方式与to("direct:zh_ICS_Test")进行交流。

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

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

如果您计划定期运行路线,可以使用Quartz Component进行操作(请阅读实施细则的文档):

from("quartz://myGroup/myTimerName?trigger.repeatInterval=2000&trigger.repeatCount=5").to("direct:zh_ICS_Test");