• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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 RedisTemplateString, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
      RedisTemplateString, Object> redisTemplate = new RedisTemplate>();
      initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
      return redisTemplate;
     }
    
     /**
      * 设置数据存入 redis 的序列化方式,并开启事务
      * 
      * @param redisTemplate
      * @param factory
      */
     private void initDomainRedisTemplate(@Qualifier("RedisTemplateS") RedisTemplateString, Object> redisTemplate, RedisConnectionFactory factory) {
      // 如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to
      // String!
      redisTemplate.setKeySerializer(new StringRedisSerializer());
      redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    
      FastJsonRedisSerializerObject> fastJsonRedisSerializer = new FastJsonRedisSerializerObject>(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") RedisTemplateString, 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 RedisTemplateString, Object> redisTemplate;
    
     public void setRedisTemplate(RedisTemplateString, 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消息发布与订阅内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Spring Cloud Stream分区分组原理图解
    • Spring Cloud Stream如何实现服务之间的通讯
    • Spring Cloud Stream异常处理过程解析
    • 详解Spring Cloud Stream使用延迟消息实现定时任务(RabbitMQ)
    • SpringBoot+WebSocket+Netty实现消息推送的示例代码
    • SpringBoot集成WebSocket实现前后端消息互传的方法
    • SpringBoot微信消息接口配置详解
    • Spring boot项目redisTemplate实现轻量级消息队列的方法
    • Spring Cloud Stream微服务消息框架原理及实例解析
    上一篇:redis操作学习记录
    下一篇:通过redis的脚本lua如何实现抢红包功能
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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