我在我的项目中正在做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。
有人可以帮忙吗?
答案 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");