当前位置: 首页 > 编程笔记 >

Spring boot+redis实现消息发布与订阅的代码

诸腾
2023-03-14
本文向大家介绍Spring boot+redis实现消息发布与订阅的代码,包括了Spring boot+redis实现消息发布与订阅的代码的使用技巧和注意事项,需要的朋友参考一下

一.创建spring boot项目

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
  </dependency>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.41</version>
  </dependency>

二.编辑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 RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
  RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
  return redisTemplate;
 }

 /**
  * 设置数据存入 redis 的序列化方式,并开启事务
  * 
  * @param redisTemplate
  * @param factory
  */
 private void initDomainRedisTemplate(@Qualifier("RedisTemplateS") RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
  // 如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to
  // String!
  redisTemplate.setKeySerializer(new StringRedisSerializer());
  redisTemplate.setHashKeySerializer(new StringRedisSerializer());

  FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<Object>(Object.class);
  redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
  redisTemplate.setValueSerializer(fastJsonRedisSerializer);
  //redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
  //redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
  // 开启事务
  redisTemplate.setEnableTransactionSupport(true);
  redisTemplate.setConnectionFactory(factory);
 }

 /**
  * 注入封装RedisTemplate @Title: redisUtil @return RedisUtil @date
  * 
  */
 @Bean(name = "redisUtils")
 public RedisUtils redisUtil(@Qualifier("RedisTemplateS") RedisTemplate<String, Object> redisTemplate) {
  RedisUtils redisUtil = new RedisUtils();
  redisUtil.setRedisTemplate(redisTemplate);
  return redisUtil;
 }

四.编写RedisUtil消息发布方法

public class RedisUtils {
 private static final Logger log = LoggerFactory.getLogger(RedisUtils.class);

 private RedisTemplate<String, Object> redisTemplate;

 public void setRedisTemplate(RedisTemplate<String, Object> 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;
  .....................
}

到此这篇关于Spring boot+redis实现消息发布与订阅的文章就介绍到这了,更多相关Spring boot redis消息发布与订阅内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 问题 你有一个基于线程通信的程序,想让它们实现发布/订阅模式的消息通信。 解决方案 要实现发布/订阅的消息通信模式, 你通常要引入一个单独的“交换机”或“网关”对象作为所有消息的中介。 也就是说,不直接将消息从一个任务发送到另一个,而是将其发送给交换机, 然后由交换机将它发送给一个或多个被关联任务。下面是一个非常简单的交换机实现例子: from collections import default

  • 我是新的数据流和发布子工具在GCP。 需要将prem过程中的电流迁移到GCP。 当前流程如下: 我们有两种类型的数据馈送 Full Feed–其adhoc作业–完整XML的大小约为100GB(单个XML–非常复杂的一个–完整的数据–ETL作业处理此XML并将其加载到约60个表中) 单独的ETL作业用于处理完整提要。ETL作业过程完全馈送并创建负载就绪文件,所有表将被截断并重新加载 源系统每30分钟

  • 主要内容:发布/订阅流程,常用命令汇总,基本命令应用Redis PubSub 模块又称发布订阅者模式,是一种消息传递系统,实现了消息多播功能。发布者(即发送方)发送消息,订阅者(即接收方)接收消息,而用来传递消息的链路则被称为  channel。在 Redis 中,一个客户端可以订阅任意数量的 channel(可译为频道)。 消息多播:生产者生产一次消息,中间件负责将消息复制到多个消息队列中,每个消息队列由相应的消费组进行消费,这是分布式系统常用的

  • 本文向大家介绍Redis 订阅发布_Jedis实现方法,包括了Redis 订阅发布_Jedis实现方法的使用技巧和注意事项,需要的朋友参考一下 我想到使用Redis的订阅发布模式是用来解决推送问题的~。 对于概念性的叙述,多多少少还是要提一下的: 什么是Redis发布订阅?Redis发布订阅是一种消息通信模式,发送者通过通道A发送消息message,订阅过通道A的客户端就可以接收到消息messag

  • 主要内容:1 Pub/Sub的概述,2 订阅,3 取消订阅,4 模式匹配,5 发布,6 Pub/Sub原理,6.1 pubsub_channels,6.2 pubsub_patterns,7 Pub/Sub缺点详细介绍了Redis 的Pub/Sub的相关命令和优缺点,以及如何实现简单的消息队列。 1 Pub/Sub的概述 我们可以利用Redis的List数据结构实现一 个简单的消息队列,通过lpush命令写入消息,通过rpop 命令拉取消息,也可以使用BRPOP实现阻塞式的拉取消息。 上面的消息

  • 本文向大家介绍redis发布订阅Java代码实现过程解析,包括了redis发布订阅Java代码实现过程解析的使用技巧和注意事项,需要的朋友参考一下 前言 Redis除了可以用作缓存数据外,另一个重要用途是它实现了发布订阅(pub/sub)消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 为了实现redis的发布订阅机制,首先要打开redis服务;其次,引入redis需要的jar包