【问题标题】:How to properly configure this Camel route xml?如何正确配置此 Camel 路由 xml?
【发布时间】:2012-12-04 01:08:09
【问题描述】:

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

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

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

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

  • 嘶嘶声
  • 嗡嗡声

等等。我想每 5 分钟轮询一次 toProcess 队列(使用 Camel-Quartz),并将在这些消费消息(嘶嘶声、嗡嗡声等)的正文中找到的字符串合并到一个 JDBC SELECT 语句中,该语句查找任何 @ 987654329@,其widget_name 匹配字符串(例如 fizz 或 Buzz)。

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

回顾一下:

  1. 外部进程在toProcess 队列中放置一个字符串,例如“fizz”
  2. Camel-Quartz 作业每 5 分钟触发一次,并将“fizz”(和任何其他)出列
  3. Camel-JDBC SELECT * FROM widgets WHERE widget_name = 'fizz' --> 我怀疑我需要 XPath
  4. 说 25 widget 记录由查询返回
  5. 所有 25 个都被序列化(二进制/JSON/XML?)并放在ready 队列中
  6. 一个接一个,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>

任何骆驼向导可以在这里为我指明正确的方向(除了参考我应该阅读的骆驼行动中的章节;-))。具体来说,我遇到了麻烦:

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

提前致谢。

【问题讨论】:

    标签: java xml serialization routing apache-camel


    【解决方案1】:

    你需要使用一些其他的语言而不是常量,因为那只是一个常量。 例如简单的、时髦的,甚至是像速度等模板语言。 创建要使用的 SQL 的位置。

    试试

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

    您能在此处查看支持的语言吗 http://camel.apache.org/languages

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

    【讨论】:

    • 我不喜欢这段代码 sn-p,因为我担心 SQL 注入...除非 camel-jdbc 有办法阻止 SQL 注入?
    猜你喜欢
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多