今天测试SpringBoot整合RabbitMq生产者系统向消费者系统发送消息,遇到一个有意思的问题,有必要记录下来。
生产者发送的消息直接使用了一个java对象,该对象实现了Serializable接口。消费者也定义了一个对应的java对象,用于接收生产者发送过来的消息。
生产者所在系统该实体类定义部分代码如下:
生产端实例化对象:
消费者所在系统对应实体类定义部分代码如下:
我们都知道,实现了Serializable接口的java对象是可以进行IO传输的,所以作为消息的一部分进行传递也是没问题的,可是在测试过程中消费端会报反序列化失败的异常,如下:
经过一番排查,发现代码中存在两个问题会导致出现这个异常。
1、生产端通过全参实例化了一个对象,而消费端对应的实体类没有全参的构造方法
解决办法:
生产端和消费端的构造方法个数和参数必须一样。特别注意:生产端如果没有带全部参数的构造方法,消息可以发送成功,但消费端即使有带全部参数的构造方法也无法反序列化该对象。
2、生产端或者消费端实体类定义的serialVersionUID不一致
解决办法有两种:
①两个系统中的该实体类定义一样的serialVersionUID。
②两个系统中的该实体类都不定义serialVersionUID(类上会带有警告)。