本篇文章小编给大家分享一下Spring boot+redis实现消息发布与订阅的代码实例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
一.创建spring boot项目
org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-web com.alibaba fastjson 1.2.41
二.编辑yml配置文件
server: port: 7888 # 日志配置 logging: config: classpath:log/logback.xml level: cn.com.dhcc: info org.springframework: info org.springframework.web: info com.alibaba.nacos.client.naming: error spring: redis: host: localhost port: 6379 password: ********* database: 1 jedis: pool: max-idle: 8 max-active: 8 max-wait: -1 min-idle: 0 timeout: 5000
三.配置Redis
@Configuration public class RedisConfiguration { /** * 实例化 RedisTemplate 对象 * * @return */ @Bean("RedisTemplateS") public RedisTemplatefunctionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate<>(); initDomainRedisTemplate(redisTemplate, redisConnectionFactory); return redisTemplate; } /** * 设置数据存入 redis 的序列化方式,并开启事务 * * @param redisTemplate * @param factory */ private void initDomainRedisTemplate(@Qualifier("RedisTemplateS") RedisTemplate redisTemplate, RedisConnectionFactory factory) { // 如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to // String! redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); FastJsonRedisSerializer
四.编写RedisUtil消息发布方法
public class RedisUtils { private static final Logger log = LoggerFactory.getLogger(RedisUtils.class); private RedisTemplateredisTemplate; public void setRedisTemplate(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } public void publish(String channal ,Object obj) { redisTemplate.convertAndSend(channal,obj ); } }
五.配置消息监听
@Configuration public class RedisMessageListener { /** * 创建连接工厂 * @param connectionFactory * @param listenerAdapter * @return */ @Bean public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter,MessageListenerAdapter listenerAdapter2){ RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); //接受消息的key container.addMessageListener(listenerAdapter,new PatternTopic("phone")); return container; } /** * 绑定消息监听者和接收监听的方法 * @param receiver * @return */ @Bean public MessageListenerAdapter listenerAdapter(ReceiverRedisMessage receiver){ return new MessageListenerAdapter(receiver,"receiveMessage"); } /** * 注册订阅者 * @param latch * @return */ @Bean ReceiverRedisMessage receiver(CountDownLatch latch) { return new ReceiverRedisMessage(latch); } /** * 计数器,用来控制线程 * @return */ @Bean public CountDownLatch latch(){ return new CountDownLatch(1);//指定了计数的次数 1 } }
六.消息订阅方法
public class ReceiverRedisMessage { private static final Logger log = LoggerFactory.getLogger(ReceiverRedisMessage.class); private CountDownLatch latch; @Autowired public ReceiverRedisMessage(CountDownLatch latch) { this.latch = latch; } /** * 队列消息接收方法 * * @param jsonMsg */ public void receiveMessage(String jsonMsg) { log.info("[开始消费REDIS消息队列phone数据...]"); try { log.info("监听者收到消息:{}", jsonMsg); JSONObject exJson = JSONObject.parseObject(jsonMsg); User user = JSON.toJavaObject(exJson, User.class); System.out.println("转化为对象 :"+user); log.info("[消费REDIS消息队列phone数据成功.]"); } catch (Exception e) { log.error("[消费REDIS消息队列phone数据失败,失败信息:{}]", e.getMessage()); } latch.countDown(); } }
七.定时消息发布测试
@EnableScheduling @Component public class PublisherController { private static final Logger log = LoggerFactory.getLogger(PublisherController.class); @Autowired private RedisUtils redisUtils; @Scheduled(fixedRate = 5000) public String pubMsg() { User user=new User(1, "尚***", 26,"男","陕西省xxxx市xxxxxx县"); redisUtils.publish("phone", user); log.info("Publisher sendes Topic... "); return "success"; } }
八.测试结果
九.发布对象User实体
public class User implements Serializable { /** * */ private static final long serialVersionUID = 1L; private int id; private String name; private int age; private String sex; private String address; ..................... }
创造与魔法 安卓版v1.0.0750
创造与魔法是一款开放世界手游,在游戏中玩家可探索这个奇妙的世
创造与魔法修改版 最新版v1.0.0750
创造与魔法无限点券版是款探索冒险游戏,该款游戏的操作还是蛮自
战争与文明官方版本 安卓版v1.7.16
战争与文明是一款由上海邮通科技有限公司开发的战争策略游戏,这
迷你世界0元领皮肤无限迷你币版 最新安卓版v1.43.0
迷你世界0元购买皮肤版是这款开放沙盒冒险建造游戏的特殊破解版
创造与魔法无限经验版 安卓版v1.0.0750
创造与魔法无限经验版是款可以改造环境,整个游戏的自由度还是蛮