如何正确配置这个Camel路由xml?

时间:2012-12-04 01:08:10

标签: java xml serialization routing apache-camel

我正在尝试使用Camel的XML <camelContext>构建一个有点花哨的Camel路由。

我有两个ActiveMQ队列,toProcessready,以及一个MySQL数据库。数据库有一个widgets表,如下所示:

widget_id | widget_name | widget_value
(INT)       (VARCHAR 50)  (INT)

外部进程将原始String消息放在toProcess队列上。这些消息是简单的字符串,例如:

  • 香味
  • 嗡嗡声
  • FOO

等。我想每5分钟轮询一次toProcess队列(使用Camel-Quartz)并在JDBC SELECT语句中包含这些消息(fizz,buzz等)的主体中的字符串。查找widgets匹配字符串的任何widget_name(例如fizz或buzz)。

然后,我想从JDBC调用中获取每个widget记录并将其放在ready队列中。最后,Burninator bean应该使用ready,并将每个Widget POJO传递给其Burninator#burninate(Widget)方法。

所以回顾一下:

  1. 外部进程在toProcess队列
  2. 上放置一个字符串,例如“fizz”
  3. Camel-Quartz工作每5分钟开火一次,然后出现“嘶嘶声”(和其他任何人)
  4. Camel-JDBC SELECT * FROM widgets WHERE widget_name = 'fizz' - &gt;我怀疑我需要XPath
  5. 说查询
  6. 返回25条widget条记录
  7. 所有25个序列化(二进制/ JSON / XML?)并放在ready队列
  8. 逐个Burninator#burninate(Widget)出列ready并使用下一个出列的小部件执行
  9. 这是我到目前为止所得到的,但我知道这是错误的:

    <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>
    

    任何Camel巫师都可以指出我在正确的方向(除了参考 Camel in Action 中我应该阅读的章节;-))。特别是我遇到了麻烦:

    • 使用widget_name
    • 的相应字符串值参数化JDBC SQL
    • 将JDBC SQL返回的任何内容序列化为可以发送到ready队列
    • 的内容
    • ready队列上的消息反序列化为Java Widget POJO

    提前致谢。

1 个答案:

答案 0 :(得分:0)

你需要使用除常量之外的其他语言,因为它只是一个常数。 例如简单,常规甚至模板语言,如速度等。 在哪里创建要使用的SQL。

尝试

<simple>
            SELECT
                *
            FROM
                widgets
            WHERE
                widget_name = '${body}'
</simple>

您能在这里看到支持的语言吗? http://camel.apache.org/languages

或者使用Velocity或Freemarker等模板框架根据模板文件生成SQL。