java - 哪种 Camel DSL 适合消息处理模式?

标签 java apache-camel gson messaging enterprise-integration

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

例如,如果将 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/处理器将反序列化消息路由到正确的处理程序?

最佳答案

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

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

可能最好的方法是在解码之前进行路由。使用Content based router ,这使得路由易于遵循。

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

关于java - 哪种 Camel DSL 适合消息处理模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25460568/

相关文章:

java - 如何在 inOut 交换上 split() 之后一次仅发送 1 条消息

java - ActiveMQ主题到队列,使用Camel路由消息从Master切换到Slave时丢失?

java - 使用 Gson 解析 JSON。没有键的困难 JSON 结构

java - SWIG 和异常 : avoid using throw(Exception) in C++

java - 如何在不产生转换成本的情况下检索可能为 NULL 的 JDBC NUMERIC 列值?

java - 如何强制 Bindy 始终返回 List?

android - RoboSpice + Google HTTP Client + GSON = 无法将 JSON 解析为对象

android - 在 android GSON 中序列化 json 属性时初始化自定义属性?

java - 在没有任何变量的情况下按分隔符拆分字符串?

java - 如何将 firefox 网页保存为图像