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