我正在尝试使用 Camel 的 XML 构建一个有点花哨的 Camel 路线<camelContext>
。
我有两个 ActiveMQ 队列toProcess
和ready
一个 MySQL 数据库。数据库有一个如下所示的widgets
表:
widget_id | widget_name | widget_value
(INT) (VARCHAR 50) (INT)
外部进程将原始字符串消息放在toProcess
队列中。这些消息是简单的字符串,例如:
- “嘶嘶”
- “嗡嗡声”
- “富”
等我想toProcess
每 5 分钟轮询一次这个队列(使用 Camel-Quartz),并将在这些消费消息(fizz、buzz 等)的正文中找到的字符串合并到一个 JDBC语句中,该SELECT
语句查找任何匹配字符串(例如作为嘶嘶声或嗡嗡声)。widgets
widget_name
然后,我想widget
获取从 JDBC 调用中检索到的每条记录并将其放入ready
队列中。最后,一个Burninator
bean 应该使用ready
每个Widget
POJO 并将其传递给它的Burninator#burninate(Widget)
方法。
回顾一下:
toProcess
外部进程在队列中放置一个字符串,例如“fizz”- Camel-Quartz 作业每 5 分钟触发一次,并出列“嘶嘶声”(以及任何其他)
- Camel-JDBC
SELECT * FROM widgets WHERE widget_name = 'fizz'
--> 我怀疑我需要 XPath - 假设
widget
查询返回 25 条记录 - 所有 25 个都被序列化(二进制/JSON/XML?)并放在
ready
队列中 - 一个接一个,
Burninator#burninate(Widget)
出队ready
并与下一个出队的小部件一起执行
这是我到目前为止所得到的,但我知道这是错误的:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<package>com.myapp.bus</package>
<template id="camelTemplate"/>
<route>
<from uri="quartz://toProcessPollerJob?cron=*+5+*+*+*+?"/>
<to uri="activemq:toProcess"/>
<setBody>
<constant>
SELECT
*
FROM
widgets
WHERE
widget_name = ??? (e.g., fizz, buzz)
</constant>
</setBody>
<marshall>
<serialization/>
</marshall>
<to uri="activemq:ready"/>
<unmarshall>
<serialization/>
</unmarshall>
<to uri="bean:burninator?method=burninate"/>
</route>
</camelContext>
任何骆驼巫师都可以在这里为我指明正确的方向(除了参考我应该阅读的骆驼行动中的章节;-))。具体来说,我遇到了麻烦:
- 使用适当的字符串值参数化 JDBC SQL
widget_name
- 将 JDBC SQL 返回的任何内容序列化为可以发送到
ready
队列的内容 - 将队列上的消息反序列
ready
化为 JavaWidget
POJO
提前致谢。