用redis作为消息推送

2023-11-13

1首先写配置监听文件


@Configuration
@EnableCaching
public class RestRedisConfig extends CachingConfigurerSupport {
	
	@Value("${redis.server-addr}")
    private String host;
    @Value("${redis.server-port}")
    private int port;
    @Value("${redis.server-pass}")
    private String password;


    private int timeout = 10000;//毫秒


    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        JedisConnectionFactory fac = new JedisConnectionFactory();
        fac.setHostName(host);
        fac.setPort(port);
        fac.setPassword(password);
        fac.setTimeout(timeout);
        fac.getPoolConfig().setMaxIdle(300);
        fac.getPoolConfig().setMaxTotal(1000);
        fac.getPoolConfig().setMaxWaitMillis(1000);
        fac.getPoolConfig().setMinEvictableIdleTimeMillis(
                300000);
        fac.getPoolConfig()
                .setNumTestsPerEvictionRun(1024);
        fac.getPoolConfig().setTimeBetweenEvictionRunsMillis(
                30000);
        fac.getPoolConfig().setTestOnBorrow(true);
        fac.getPoolConfig().setTestWhileIdle(true);
        return fac;
    }

    /**
     * RedisTemplate配置
     */
    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate template = new StringRedisTemplate(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

    /**
     * redis消息监听器容器
     * 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,该消息监听器  如需监听多个 在 MessageListenerAdapter listenerAdapter后面加参数
     * 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
     * @param connectionFactory
     * @param listenerAdapter
     * @return
     */
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //可以添加多个 messageListener
        container.addMessageListener(listenerAdapter, new PatternTopic(RedisConst.TASKWORKORDER));

        return container;
    }

    /**
     * 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法  ,如需监听多个复制下面的方法
     * @param redisReceiver
     * @return
     */
    @Bean
    MessageListenerAdapter listenerAdapter(RedisReceiver redisReceiver) {
        return new MessageListenerAdapter(redisReceiver, "TaskWorkOrder");
    }


2 写订阅redis消息的类


/**
 * 接收订阅的redis消息
 */
@Service
public class RedisReceiver {
    public static final Logger logger = LoggerFactory.getLogger(RedisReceiver.class);

    @Autowired
    PushAndroid pushAndroid;


    //接收订单的服务推送
    public void TaskWorkOrder(String message) {
        try{
           logger.info("redis消息来了:"+message);
            //去掉前后多的引号
            message = message.substring(1);
            message = message.substring(0,message.length()-1);
            String sendMessage =  message.substring(0, message.indexOf("|"));
            String targetValue = message.substring(message.indexOf("|")+1);

            pushAndroid.sendMessage("01","mobile","MESSAGE","ACCOUNT",targetValue,sendMessage,sendMessage);
        logger.info("redis消息来了处理后:"+message);
        }catch (Exception e){
            logger.error("接收redis消息失败,error={}",e);
        }
    }



}

3 消息发布的测试类


/**
 * 接警发布消息服务
 */
@RestController
@RequestMapping("/abeyance/sendMessageTest")
public class sendMessageService {
    Logger logger = LoggerFactory.getLogger(sendMessageService.class);
    @Autowired
    RedisTemplate<String, String> redisTemplate;

    ObjectMapper objectMapper = new ObjectMapper();



    @PostMapping(value = "/test")
    public String resetCache(String token) throws Exception {
        CommonResult commonResult = new CommonResult();
        sendMessage(RedisConst.TASKWORKORDER,"这是个测试消息");//发布消息,

        return objectMapper.writeValueAsString(commonResult);
    }


    /**
     * redis 发布消息
     * @param key
     * @param message
     */
    public void sendMessage(String key, String message) {
        redisTemplate.convertAndSend(key,message);
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用redis作为消息推送 的相关文章

随机推荐

  • ASP.NET的优点

    ASP NET 是一个统一的 Web 开发平台 它提供开发人员创建企业级 Web 应用程序所需的服务 尽管 ASP NET 的语法基本上与 ASP 兼容 但是它还提供了一个新的编程模型和基础结构以提高应用程序的安全性 缩放性和稳定性 通过逐
  • Qt信号与槽原理

    Qt信号与槽原理 本文为原创文章 转载请注明出处 或注明转载自 黄邦勇帅 原名 黄勇 本文出自本人原创著作 Qt5 10 GUI完全参考手册 网盘地址 https pan baidu com s 1iqagt4SEC8PUYx6t3ku39
  • vue+echarts 实现地图tooltip点击事件;toolTip数据动态渲染;同时鼠标滑过涟漪点时实现地图多区域联动

    最终做出来的效果是这样的 最近做项目时 遇到这样的需求 1 toolTip上的数据根据后台动态渲染 2 鼠标移入地图涟漪点时显示tootTip 点击toolTip上的文字 携带动态数据id进行路由跳转 3 鼠标移入地图涟漪点 与涟漪点相关的
  • 学习Linux的注意事项(使用经验;目录作用;服务器注意事项)

    本篇分享学习Linux过程中的一些经验 文章目录 1 Linux系统的使用经验 2 Linux各目录的作用 3 服务器注意事项 1 Linux系统的使用经验 Linux严格区分大小写 Linux中所有内容以文件形式保存 包括硬件 Linux
  • 浅谈A/B测试 ,看这一篇就足够了

    随着流量红利的逐渐消失 越来越多的公司开始重视数据驱动 试验驱动的精细化运营思想 并积极进行实践 有些公司在考虑采购第三方试验平台 有些公司考虑自建试验平台 我们和这样的公司都有深入的接触 发现很多公司对试验平台应该是什么样的 有什么样的坑
  • Java中使用同步代码块、同步方法(synchronize关键字)和Lock锁解决线程安全问题

    目录 一 线程安全概述 二 线程同步 同步代码块 同步方法 使用Lock锁 三 注意事项 四 synchronize和lock的异同 一 线程安全概述 生活中我们往往会出现多个人共用同一个事物的情况 比如说两个人可以共用一个游戏账号 这样两
  • 优化问题的拉格朗日Lagrange对偶法原理

    首先我们定义一般形式的求解x的优化问题 表示优化的目标函数 上述为最小优化 实际上最大优化可以改写为的形式 表示第i个不等式约束 表示等式约束 1 Lagrange对偶问题 上述优化问题的拉格朗日Lagrange对偶法求解 是将上述带约束的
  • 【C语言初学必看】一知半解的for循环嵌套for循环

    前言 目录 初学C语言 常常遇到for循环中嵌套个for循环 初学者对于这种形式总是一知半解 这次我就整理了常见的for循环嵌套for循环的题目 我们一起争取一举拿下这类题 学废他们 以后再见到就不怕啦 每天都要学一点呀 加油 奋斗的我们
  • Pytorch学习笔记

    文章目录 配置环境 机器学习中的分类与回归问题 PyTorch的基本概念 Tensor的类型 Tensor的创建 Tensor的属性 Tensor的算术运算 in place操作 Pytorch中的广播机制 取整 取余运算 Tensor的比
  • 使用 AntV X6 + vue 实现单线流程图

    使用 AntV X6 vue 实现单线流程图 X6 是 AntV 旗下的图编辑引擎 提供了一系列开箱即用的交互组件和简单易用的节点定制能力 方便我们快速搭建 DAG 图 ER 图 流程图等应用 官方文档 安装 yarn add antv x
  • react笔记_10react路由

    目录 什么叫做路由 路由组件与一般组件区别 react中配置路由 1 下载 2 注册路由 Switch Route组件的三个互斥属性 component render children 3 导航区 路由跳转 编程式导航 在新窗口打开页面 在
  • 霍尔增量式编码器左右车轮线速度的计算

    对于霍尔式编码器的左右轮线速度计算 首先线速度 距离s 时间 t 要获得距离S 也就是轮子在一段时间内跑过的距离 要先知道一下两个参数 1 轮子的半径 r 2 轮子转动一圈的脉冲数 cnt 轮子转动一圈的脉冲数 如电机我们选用减速比为1 9
  • docker以及docker-compose安装

    centos7下docker安装 官方安装文档 https dockerdocs cn engine install centos index html 安装依赖包 yum install y yum utils device mapper
  • 2020-12-06

    实验四 CTF实践 实验目的 通过对目标靶机的渗透过程 了解CTF竞赛模式 理解CTF涵盖的知识范围 如MISC PPC WEB等 通过实践 加强团队协作能力 掌握初步CTF实战能力及信息收集能力 熟悉网络扫描 探测HTTP web服务 目
  • 报错 AttributeError: ‘WebDriver‘ object has no attribute ‘find_elements_by_xpath‘ 解决方法

    报错 AttributeError WebDriver object has no attribute find elements by xpath 解决方法 汉 AttributeError WebDriver 对象没有属性 find e
  • Hbase Shell操作

    文章目录 Hbase Shell操作 1 创建表 2 数据库表基本操作 2 1 添加数据 2 2 删除数据 2 2 1 delete命令 2 2 2 deleteall命令 2 3 查看数据 2 3 1 get命令 2 3 2 scan命令
  • 【Twinkle】Chrome快捷键是真的好用

    1 标签页和窗口快捷键 快捷键 说明 Ctrl n 打开新窗口 Ctrl shift n 在隐身模式下打开新窗口 Ctrl t 打开新的标签页 常用 Ctrl Shift t 重新打开最后关闭的标签页 Ctrl Tab 或 Ctrl Pgd
  • java聊天室的设计与实现代码

    聊天室是一个简单的通信应用 可以帮助您与客户和朋友保持联系 并且可以让您更轻松地与其他员工联系 然而 您将不得不确保每个人都知道他们正在做什么 一旦聊天室开始 它就会变得非常复杂 因为有许多用户可能会同时登录 例如 如果您有一个新的工作机会
  • openGL之API学习(六十二)glBufferData

    往gpu缓冲区写入数据 void glBufferData GLenum target GLsizeiptr size const GLvoid data GLenum usage target Specifies the target t
  • 用redis作为消息推送

    1首先写配置监听文件 Configuration EnableCaching public class RestRedisConfig extends CachingConfigurerSupport Value redis server