gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:14:58 25 4
gpt4 key购买 nike

因此,我们在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com