2

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

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

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

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

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

这里有两个大问题:

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

1 回答 1

2

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

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

可能最好的方法是在解组之前进行路由。使用基于内容的路由器,它提供了易于遵循的路由。

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

于 2014-08-23T14:51:04.640 回答