【问题标题】:What Camel DSL is appropriate for message handling pattern?什么 Camel DSL 适合消息处理模式?
【发布时间】:2014-10-17 02:35:05
【问题描述】:

我有一种情况,我需要应用程序将消息发送到消息代理。然后,另一个侦听代理的客户端必须使用队列中的消息,确定它们是什么类型的消息,并将消息传递给适当的处理程序。

例如,如果Fizz POJO 被序列化为 JSON,然后发送到代理,则其他进程必须使用它,将其从 JSON 反序列化回 Fizz 实例,然后知道传递 Fizz转到FizzHandler 处理器。 Buzz 消息也是如此:应该将其反序列化回 Buzz 并发送到 BuzzHandler 等。

我相信路由的伪代码应该是这样的:

from(broker)
    .unmarshal().json(JsonLibrary.Gson)
    .dynamicRouter(someMechanismForDeterminingHandler)

相信动态路由器是解决这个问题的合适处理器,但不是 EIP 专家,我可能不适合我。

这里有两个大问题:

  • Camel-GSON 怎么知道一种 JSON 代表 Fizz 对象,而另一种 JSON 字符串代表 Buzz 对象?
  • 应该使用什么 EIP/Camel DSL/处理器将反序列化的消息路由到正确的处理程序?

【问题讨论】:

    标签: java apache-camel gson messaging enterprise-integration


    【解决方案1】:

    您需要提前知道将某个字符串解组到哪个类。 设置数据格式并在您想要解组到 Fizz 的任何地方引用它。 Pojo -> JSON 更容易,因为 gson 可以通过查看手头的对象来确定您的格式。

    GsonDataFormat json2Fizz = new GsonDataFormat(Fizz.class);
    GsonDataFormat json2Buzz = new GsonDataFormat(Buzz.class);
    

    可能最好的方法是在解组之前进行路由。使用Content based router,它提供了易于跟踪的路由。

    如果您在 json 本身中有一些东西可以让您识别 Fizz 或 Buzz,您可以使用表达式语言 JsonPath,它允许您直接在 json 字符串上路由/过滤等。如果没有,您可能希望传递一个标头,以某种方式说明您可以路由的消息类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 2012-06-20
      • 1970-01-01
      相关资源
      最近更新 更多