【发布时间】:2019-12-15 15:17:13
【问题描述】:
我在将 RabbitMQ 中收到的 Byte[] 消息转换为基于模型的某个对象时遇到问题。
我正在使用 Spring Boot。
在我已经实现RabbitListenerConfigurer的应用程序中:
@SpringBootApplication
class Application : RabbitListenerConfigurer {
...
override fun configureRabbitListeners(registrar: RabbitListenerEndpointRegistrar) {
registrar.messageHandlerMethodFactory = messageHandlerMethodFactory()
}
@Bean
fun messageHandlerMethodFactory(): MessageHandlerMethodFactory {
val messageHandlerMethodFactory = DefaultMessageHandlerMethodFactory()
messageHandlerMethodFactory.setMessageConverter(consumerJackson2MessageConverter())
return messageHandlerMethodFactory
}
@Bean
fun consumerJackson2MessageConverter(): MappingJackson2MessageConverter {
return MappingJackson2MessageConverter()
}
}
然后我有一个听众(println 只是暂时让我检查),例如:
@RabbitListener(queues = ["success.queue"])
fun receivedSuccessMessage(data: MyModel) {
println(data)
}
模型本身看起来像(再次简化只是为了测试):
@JsonIgnoreProperties(ignoreUnknown = true)
data class MyModel(
val input: Any,
val metadata: Any
)
现在,每当该队列收到消息时,我得到的错误是:
Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [[B] to [com.models.MyModel] for GenericMessage [payload=byte[1429]
还将我收到的消息添加到该成功队列中,如下所示:
{"input":"somestuff", "metadata": "somestuff"}
我也刚刚注意到消息类型是content_type: application/octet-stream。这是我无法控制的,因为这正是我从将消息放入其中的服务收到的:
任何想法为什么会这样 - 我假设我拥有的 RabbitListenerConfigurer 实现将所有消息从字节数组转换为我指定的任何模型。
任何帮助/想法将不胜感激。
谢谢。
更新 好的,我得到了这个工作,但是我对某些事情感到很困惑:
这是我添加的:
@Autowired
lateinit var connectionFactory : ConnectionFactory
@Bean
fun rabbitListenerContainerFactory(): SimpleRabbitListenerContainerFactory {
val factory = SimpleRabbitListenerContainerFactory()
factory.setConnectionFactory(connectionFactory)
factory.setAfterReceivePostProcessors(SomeBusiness())
return factory
}
然后是这样的实际转换:
class SomeBusiness : MessagePostProcessor {
@Throws(AmqpException::class)
override fun postProcessMessage(message: Message): Message {
println("WE WENT IN NOW")
println()
if (message.messageProperties.contentType == "application/octet-stream") {
message.messageProperties.contentType = "application/json"
}
return message
}
}
但我不明白的是,我已经有了我的 messageHandlerMethodFactory 函数,我认为它完成了所有关于收听消息的工作。既然我有rabbitListenerContainerFactory,是否有任何冲突的担忧。或者它是否完全有效,即我需要rabbitListenerContainerFactory,因为它实现了SimpleRabbitListenerContainerFactory,这使我可以访问setAfterReceivePostProcessors 方法。
再次感谢任何解释。
谢谢
【问题讨论】:
标签: spring spring-boot kotlin rabbitmq