从头开始学Redisson--------话题(订阅分发)

网友投稿 677 2022-10-29

从头开始学Redisson--------话题(订阅分发)

从头开始学Redisson--------话题(订阅分发)

一、Redisson作为消息中间件

没想到Redisson居然还有订阅发布功能,类似于RabbitMQ。之前在用Redis的时候,可以利用List这种数据类型的左进右出的特性,能够做消息中间件。不知道这次Redisson的底层是不是这样实现的。Redis实现中间件传送门:第四节 List作为消息中间件

我这里假设把一个用户对象进行推送。实现思路就是前端传一个用户的ID过来。我们在数据库中找到这个用户,然后把这个用户对象塞入Redisson的消息队列中。再编写一个-,不断得从队列中获取消息。

二、技术参考要点

技术参考文档。RTopic topic = redisson.getTopic("anyTopic");topic.addListener(SomeObject.class, new MessageListener() { @Override public void onMessage(String channel, SomeObject message) { //... }});// 在其他线程或JVM节点RTopic topic = redisson.getTopic("anyTopic");long clientsReceivedMessage = topic.publish(new SomeObject());

实战:生产端代码

核心代码TopicService。方法上接受一个用户对象。然后通过Redisson客户端的getTopic方法获取RTopic对象。最后把我们需要推送的MUser对象,使用RTopic对象的publish方法加入到消息队列中。可参考上面的文档。

package com.tyzhou.redisson.service;import com.tyzhou.Constant;import com.tyzhou.mail.modol.MUser;import org.apache.commons.lang3.StringUtils;import org.redisson.api.RTopic;import org.redisson.api.RedissonClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class TopicService { @Autowired private RedissonClient redisson; public void sendEmail(MUser user) { if (user != null && StringUtils.isNotBlank(user.getEmail())) { RTopic topic = redisson.getTopic(Constant.REDISSON_EMAIL); topic.publish(user); } }}

实战:消费端代码

为了让我们有一个类似-的对象,我们可以实现一个叫做ApplicationRunner接口,然后这个实现类就会一直在内存中。

实现Ordered接口为其制定顺序,因为可能有多个ApplicationRunner接口的实现类。

技术参考文档:RTopic topic = redisson.getTopic("anyTopic");topic.addListener(SomeObject.class, new MessageListener() { @Override public void onMessage(String channel, SomeObject message) { //... }});

import com.tyzhou.Constant;import com.tyzhou.mail.modol.MUser;import org.redisson.api.RTopic;import org.redisson.api.RedissonClient;import org.redisson.api.listener.MessageListener;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.ApplicationArguments;import org.springframework.boot.ApplicationRunner;import org.springframework.core.Ordered;import org.springframework.stereotype.Service;@Servicepublic class TopicListener implements ApplicationRunner, Ordered { private static final Logger LOGGER = LoggerFactory.getLogger(TopicListener.class); @Autowired private RedissonClient redisson; @Override public void run(ApplicationArguments applicationArguments) throws Exception { RTopic topic = redisson.getTopic(Constant.REDISSON_EMAIL); topic.addListener(new MessageListener() { @Override public void onMessage(CharSequence charSequence, MUser user) { LOGGER.info("Redisson-收到消息:{}", user); } }); } @Override public int getOrder() { return 1; }}

三、实现效果

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:pexpect: 在一个伪终端中控制交互程序,就像 GNU expect 一样
下一篇:dry - 一个用于管理Docker容器和镜像的终端应用程序
相关文章

 发表评论

暂时没有评论,来抢沙发吧~