关于SpringCloudBusRemoteApplicationEvent使⽤注意事项
最近使⽤SpringCloud Bus
开发环境 :
springboot 2.3.9.RELEASE
spring-cloud-alibaba-starters 2.2.5.RELEASE
rabbitmq
问题⼀:消息publishEvent
监听服务的类没有注⼊到spring容器中,未加RemoteApplicationEventScan注解扫描⾃定义的Event对象,
消息发送的时候originService传⼊的服务id和springcloud bus
在spring-cloud-bus包中的BusAutoConfiguration配置信息可以看到,发送消息时会匹配serviceId,配置⼀致才发送,⽽默认情况下bus会⾃动⽣成⼀个serviceId,如果我们发送的时候⽤的是⾃⼰随便定义的id,则⽆法发送消息。
建议在配置⽂件中配置busId,然后从BusProperties类中获取。这样就保证了⼆者⼀致
获取配置的bus id
消息发送者和接收者的rabbitmq
默认情况下,rabbitmq有⾃⼰的消息序列化规则,由于我在消息发送服务配置过rabbitmq的序列化为json格式,但是接收服务没有使⽤的默认的格式,导致消息发出去之后,接收服务⽆法正确反序列化,导致消息消费失败。所以要么就都不配置,要么所有服务都配置
springcloud和springboot
问题⼆:消息发送成功,监听服务也收到消息,但是Event的source
这个问题困扰了我很久,明明source字段传了值,但是别的服务就是拿不到,⽽且发送服务⾃⼰创建监听服务,是能拿到的。经过查询离职发现,RemoteApplicationEvent的烦序列化的时候忽略了source,也就是说就算你传值了,也不会处理,可能是怕使⽤者传的数据⼤?
解决办法,⾃定义Event的时候可以⾃定义参数进⾏传值。
结果如下,是可以拿到参数的