实现原理
参考了使用Redis实现MQ
Redis中的publish-subscribe
redis中已经实现了publish-subscribe,订阅者(Subscriber)可以订阅自己感兴趣的频道(Channel),发布者(Publisher)可以将消息发往指定的频道(Channel),正式通过这种方式,可以将消息的发送者和接收者解耦。另外,由于可以动态的Subscribe和Unsubscribe,也可以提高系统的灵活性和可扩展性。
- 打开redis客户端,使用SUBSCRIBE命令就可以订阅消息了,如:
- 发布命令如下:
- 这样在消息订阅的一方就可以接收到消息了,如下:
在SpringBoot中使用
ok,也就是只要提供一个RedisMessageListenerContainer和一堆MessageListenerAdapter给spring即可 而这些完全可以通过给方法加注解+反射直接创建出来
理论存在,实践开始!
- 首先需要拿到所有带有
@RedisMessageListener
注解的方法 在苦苦搜寻了一番后,在stackoverflow上找到了org.reflections.Reflections这个类(maven依赖地址),使用下面的方式就ok了
- 那么应该如何直接获取当前项目的basePackage呢?
又苦苦搜寻了一番后,终于在springboot的issues中找到了
AutoConfigurationPackages.get()
看一下所需参数,BeanFactory
!ok,从applicationContext
中掏出来传给他 打印输出返回值[com.coderxi]
,完美!拿到第一个即可!
- 拿到了方法,也就能够拿到方法所在的类,再从容器中实例,就满足了构造
MessageListenerAdapter
的参数 但是,这个MessageListenerAdapter必须注册到容器 - 那么应该如何使用Java代码手动注册对象到Spring容器呢?
第三次苦苦搜寻了一番后,又通过尝试,找到了最优雅最简洁的方式
使用
AnnotationConfigApplicationContext
的registerBean
注册进去,然后get回来就ok 实例的名字不能重复,我就直接采用了方法名+类名+"MessageListenerAdapter"
作为实例名 - 最后,按照上面的
RedisMessageListenerContainer
的配置方式 将所有MessageListenerAdapter
实例和对应的channel
(也就是topic
) 交给他即可
成果
- 向
channel1
频道发送消息,我们可以看到两个都响应了
- 向
channel2
频道发送消息,我们可以看到只有receive2响应了
评论