用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作为消息推送 的相关文章

  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其

随机推荐

  • 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