我想使用RabbitMQ在部署在不同网络上并由不同人员维护的多个应用程序之间进行通信。作为消息的接收者(消费者),我想确信消息的发送者(生产者)是他声称的身份。我能想到的最佳方法是消息签名和这些签名的验证。由于这是我第一次使用RabbitMQ进行操作,因此我对如何实现此目标有些困惑。
消息发送者和接收者是Java应用程序。我决定使用Spring AMQP模板使事情变得更容易些。在理想的情况下,我想以某种方式截取消息,当它已经是字节数组/流时,对这个Blob签名并附加签名作为消息头。在接收端,我想再次对消息进行反序列化之前对其进行拦截,针对Blob验证标头中的签名,如果一切正常,然后对它进行反序列化。但是我在Spring-Rabbit中还没有找到实现此目的的任何方法。
在Spring-Rabbit中有一个MessagePostProcessor
的概念,但是当调用它时,消息仍然没有完全序列化。似乎我想像的某事会被某人解决,因为这似乎是一个常见的问题,但是我的研究使我无所适从。
当前,我正在使用AmqpTemplate.convertAndSend
进行消息发送,并使用@RabbitListener
进行消息接收。但是我不喜欢Spring。我可以使用任何我喜欢的东西。这似乎只是一种简单的方法。我正在使用Jackson将消息序列化到JSON或从JSON序列化。 问题是如何在正确的位置拦截发送和接收。
备份计划是将数据和签名都放在正文中,并用包装器将它们结合在一起,但这将意味着双重序列化,并且不如我希望的解决方案那么干净。
那么有没有人对这方面的东西有经验,也许可以给我建议如何解决这个问题?
答案 0 :(得分:1)
Spring-Rabbit中有一个
MessagePostProcessor
的概念,但是当调用它时,消息仍未完全序列化。
我不确定你的意思是什么; MessagePostProcessor
正是您所需要的body
是将被发送到RabbitMQ的byte[]
。您可以使用采用MPP的重载convertAndSend
方法,也可以将MPP添加到模板中(在beforeSendMessagePostProcessors
中)。
在接收方,可以使用afterReceiveMessagePostProcessors
配置侦听器容器工厂。再次; body
是从RabbitMQ收到的byte[]
。