我遇到需要应用程序向消息代理发送消息的情况。然后,另一个侦听代理的客户端必须使用队列中的消息,确定它们是什么类型的消息,并将消息传递给适当的处理程序。
例如,如果将Fizz
POJO序列化为JSON然后发送给代理,则另一个进程必须使用它,将其从JSON反序列化为Fizz
实例,然后知道通过Fizz
关闭到FizzHandler
处理器。对于Buzz
消息也是如此:它应该反序列化为Buzz
并发送给BuzzHandler
等。
我相信路线的伪代码应该是这样的:
from(broker)
.unmarshal().json(JsonLibrary.Gson)
.dynamicRouter(someMechanismForDeterminingHandler)
我相信动态路由器是解决此问题的合适处理器,但不是EIP专家,我可能不在我的元素中。
这里有两大问题:
Fizz
对象,而另一种JSON代表Buzz
对象?答案 0 :(得分:2)
您需要知道要提前解组某个字符串的类。 设置数据格式并在任何您想要解组到Fizz的地方引用它。 Pojo - > JSON更容易,因为gson可以通过查看手中的对象来计算您的格式。
GsonDataFormat json2Fizz = new GsonDataFormat(Fizz.class);
GsonDataFormat json2Buzz = new GsonDataFormat(Buzz.class);
可能最好的方法是在解组之前进行路由。使用Content based router,可以轻松跟踪路由。
如果你在json中有一些能够识别Fizz或Buzz的东西,你可以使用表达式语言JsonPath,它允许你直接在json字符串上路由/过滤等。如果没有,您可能希望传递一个标题,以某种方式说明您可以路由的消息类型。