Spring amqp @RabbitListener运行时类型问题

时间:2016-07-25 08:49:16

标签: java spring rabbitmq spring-amqp

所以我们在spring-amqp中使用漂亮的@RabbitHandler注释来创建类似于RestControllers的编码风格的端点,但是在引擎盖下使用Rabbit。它非常漂亮和整洁,它特别适用于基于签名的方法处理程序的动态解析。但是,我们在这里面临一些争议。 想象一下以下方法

@RabbitHandler
public void handleEmailDto(EmailDto message) {
    System.out.println(message);
}

这将由MessagingMessageConverter.java类上的fromMessage方法处理。在链的某个点上,将需要消息的类型信息,以便处理程序解析器确定使用消息的有效负载调用哪个方法,以及将有效负载序列化到哪个类。问题是我们正在使用MappingJackson2MessageConverter。然而,我们需要一个填充的____TypeId____支持消息,其中包含类的类型的完全限定名称。这也不是问题。精心设计和思考。

当这个类不在类路径上时会出现问题。这对我们来说实际上是一个巨大的痛苦,因为我们正在微服务环境中工作,我们的一些服务完全脱钩。那就是..我们不希望拥有保存我们数据域的“共同”假象,因此我们可以在运行时在消息的发送者和接收者中使用它。我已经跟踪了代码,我看到这个洞类型的情况是如何处理的以及为什么它按原样完成。

然而,从架构的角度来看,这是非常有限的......这是否意味着我们肯定需要在微服务之间共享代码,这些微服务相当分离,否则只是为了满足序列化/反序列化/方法解析逻辑?

也许我错过了某些东西或忽略了另一种方式。如果是这样的话,我肯定会接受建议。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

1.6有new feature,其中@RabbitListener的参数类型提供给JSON消息转换器,它可以使用它而不是类型id头。

不幸的是,这种机制不能与@RabbitHandler一起使用,因为在有效载荷被转换后,确定了

您不需要类路径上的源类型,您可以将转换器配置为使用其他类型;有关我们发送Foo1并收到Foo2的示例,请参阅this test case

侦听器为here,并且具有自定义转换器的侦听器工厂配置为here。了解如何将idClassMapping设置为转换为Foo2类型。

显然,类型必须与源类型兼容,但它不必是同一类。