java - Spring amqp @RabbitListener 运行时类型问题

标签 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.6有一个new feature其中 @RabbitListener 的参数类型被提供给 JSON 消息转换器,它可以使用它来代替类型 id header 。

不幸的是,这种机制不适用于@RabbitHandler,因为处理程序方法是(必须)有效负载转换后确定的。

您不需要类路径上的源类型,您可以配置转换器以使用不同的类型;请参阅this test case例如,我们发送 Foo1 并接收 Foo2

监听器是here带有自定义转换器的监听器工厂配置为 here 。了解如何设置 idClassMapping 以转换为 Foo2 类型。

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

关于java - Spring amqp @RabbitListener 运行时类型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38563283/

相关文章:

java - 替换Java字符串中特定长度的子字符串

java - 使用java rmi激活系统的主要目的是什么?

c# - 使用 RabbitMQ 的 MassTransit - RecieveFrom 的地址

rabbitmq - Celery与Rabbitmq创建结果多个队列

公共(public)类 MyApplication extends Application 引起的 java.lang.NullPointerException

java - 我无法导入 AppCompatActivity

java - Spring AOP执行顺序

java - 我们可以有一个工厂类作为 spring bean 并有一个工厂方法根据条件返回多个 spring bean 吗?

java - 当我的 Spring 应用程序运行时,它没有使用我的 TogglzConfig 文件

windows - 如何重启rabbitmq中的erl.exe和epmd.exe?