使用rabbitmq发送消息和caffeineCache保存本地

目录

使用stock_job工程采集到国内大盘的最新交易时间的信息并插入数据库,使用rabbitmq发送消息

 1.导入依赖

2.编写yml文件,配置连接rabbitmq的信息

3.编写mq的配置类,生成交换机,消息队列,并将他们绑定

4.采集最新到最新的国内大盘数据信息,并插入到数据时时,发送消息

5.查看消息队列是否存在消息

在stock_backend工程中定义消息监听类,并配置本地缓存

1.导入mq依赖和caffeine

 2.编写yml文件

3.编写caffeine的配置类,和mq的配置类

4.编写消息监听类

5. stockService.getInnerMarket()方法

6.debug启动SpringBoot引导类

自动跳到消息监听类

清空缓存,然后调用mapper方法重新向数据库查询最新的国内大盘数据,再重新保存到本地缓存中

​编辑 查看caffeineCache成员变量的值

成功缓存key为innerMarketInfosKey

的数据


当我们在查询最新的股票大盘数据时,我们会频繁的向mysql查询数据,会给mysql造成很大的压力,所以我们可以使用caffeineCache本地缓存。

大致思路:
我们先使用stock_job工程采集到国内大盘的最新交易时间的信息时并将数据插入数据库,使用rabbitmq发送消息(消息为当前时间)

在stock_backend工程定义消息队列监听类,如果接收到的时间和发送消息的时间相差一分钟时,就报错,不超过一分钟,就清除之前的本地缓存,再通过mapper向数据库查询数据,然后再重新把最新的国内大盘数据存入本地缓存中。

这样一来,如果stock_job工程没有向数据库中插入最新交易时间的国内大盘数据信息,在stock_backend中查询最新交易时间的国内大盘数据信息时,就会直接从本地缓存中获取数据信息。

使用stock_job工程采集到国内大盘的最新交易时间的信息并插入数据库,使用rabbitmq发送消息

 1.导入依赖

<!--        导入mq依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

2.编写yml文件,配置连接rabbitmq的信息

spring:rabbitmq:host: 192.168.230.100 # rabbitMQ的ip地址port: 5672 # 端口username: hhhpassword: 1234virtual-host: /

3.编写mq的配置类,生成交换机,消息队列,并将他们绑定

@Configuration
public class MqConfig {/*** 重新定义消息序列化的方式,改为基于json格式序列化和反序列化*/@Beanpublic MessageConverter messageConverter() {return new Jackson2JsonMessageConverter();}/*** 国内大盘信息队列*/@Beanpublic Queue innerMarketQueue() {return new Queue("innerMarketQueue", true);}/*** 定义路由股票信息的交换机*/@Beanpublic TopicExchange innerMarketTopicExchange() {return new TopicExchange("stockExchange", true, false);}/*** 绑定队列到指定交换机*/@Beanpublic Binding bindingInnerMarketExchange() {return BindingBuilder.bind(innerMarketQueue()).to(innerMarketTopicExchange()).with("inner.market");//设置routingKey}
}

4.采集最新到最新的国内大盘数据信息,并插入到数据时时,发送消息

@Overridepublic void getInnerMarketInfo() {//......//解析的数据批量插入数据库int count= stockMarketIndexInfoMapper.insertBatch(entities);log.info("当前插入了:{}行数据",count);//通知后台终端刷新本地缓存,发送的日期数据是告知对方当前更新的股票数据所在时间点rabbitTemplate.convertAndSend("stockExchange","inner.market",new Date());}

5.查看消息队列是否存在消息

在stock_backend工程中定义消息监听类,并配置本地缓存

1.导入mq依赖和caffeine

 <dependencies><!--        导入mq依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
<!--        本地缓存依赖--><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId></dependency>

 2.编写yml文件

spring:rabbitmq:host: 192.168.230.130 # rabbitMQ的ip地址port: 5672 # 端口username: hhhpassword: 1234virtual-host: /

3.编写caffeine的配置类,和mq的配置类

 /*** 构建缓存bean* @return*/@Beanpublic Cache<String,Object> caffeineCache(){Cache<String, Object> cache = Caffeine.newBuilder().maximumSize(200)//设置缓存数量上限
//                .expireAfterAccess(1, TimeUnit.SECONDS)//访问1秒后删除
//                .expireAfterWrite(1,TimeUnit.SECONDS)//写入1秒后删除.initialCapacity(100)// 初始的缓存空间大小.recordStats()//开启统计.build();return cache;}

这里不用定义交换机和消息队列 

@Configuration
public class MqConfig {/*** 重新定义消息序列化的方式,改为基于json格式序列化和反序列化*/@Beanpublic MessageConverter messageConverter() {return new Jackson2JsonMessageConverter();}
}

4.编写消息监听类

@Component
@Slf4j
public class MqListener {@Autowiredprivate Cache<String,Object> caffeineCache;@Autowiredprivate StockService stockService;@RabbitListener(queues = "innerMarketQueue")public void acceptInnerMarketInfo(Date date){//消息队列里的数据类型是Date,所以接收的参数类型也是Datelong differTime = DateTime.now().getMillis() - new DateTime(date).getMillis();if(differTime>60000L){log.error("采集国内大盘时间点:{},同步超时:{}ms",new DateTime(date).toString("yyyy-MM-dd HH:mm:ss"),differTime);}//发送信息和接收信息在一分钟以内//删除key为innerMarketInfosKey的缓存caffeineCache.invalidate("innerMarketInfosKey");//重新获取数据//调用服务更新缓存stockService.getInnerMarket();}
}

5. stockService.getInnerMarket()方法

    /*** 获取国内大盘最新的数据* @return*/@Overridepublic R<List<InnerMarketDomain>> getInnerMarket() {//获取key为innerMarketInfosKey的本地缓存数据,如果不存在,就去数据库中查询数据,并存入本地缓存中//本地缓存默认一分钟消失R<List<InnerMarketDomain>> result= (R<List<InnerMarketDomain>>) caffeineCache.get("innerMarketInfosKey", key->{//1.获取当前时间的最新交易点(精确到分钟,秒和毫秒置为0)Date curDate = DateTimeUtil.getLastDate4Stock(DateTime.now()).toDate();//Date curDate = MyDateTimeUtil.getLateDate4Stock(DateTime.now()).toDate();//mock data 等后续股票采集job工程完成,再将此代码删除curDate=DateTime.parse("2021-12-28 09:31:00", DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).toDate();//log.info("curDate:{}",curDate);//2.获取国内大盘的编码集合List<String> mcodes = stockInfoConfig.getInner();//3.调用mapper进行查询List<InnerMarketDomain> data=stockMarketIndexInfoMapper.getInnerMarket(curDate,mcodes);//4.返回数据return R.ok(data);});return result;}

6.debug启动SpringBoot引导类

自动跳到消息监听类

清空缓存,然后调用mapper方法重新向数据库查询最新的国内大盘数据,再重新保存到本地缓存中

 查看caffeineCache成员变量的值

成功缓存key为innerMarketInfosKey

的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419191.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos安装配置Gitea(Ubuntu等系统也可参考)

准备工作 安装好宝塔面板&#xff0c;再进入宝塔面板安装好MySQL&#xff0c;添加配置一个MySQL数据库gitea&#xff0c;用户名和密码也为gitea &#xff08;也可用命令行做相关操作&#xff0c;自行搜索教程&#xff09; 通过终端下载安装git&#xff0c;添加普通用户git&a…

《Nginx核心技术》第16章:实现Nginx的高可用负载均衡

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 星球项目地址&#xff1a;https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

网络安全AI大模型训练从入门到精通

前言 2022年下半年&#xff0c;国内安全圈内开始完chatGPT&#xff0c;当时在安全圈内小火了一把。大家纷纷注册去体验一把&#xff0c;希望chatGPT能帮助解决日常安服渗透问题。当时以为仅此而已&#xff0c;谁知年后大火&#xff0c;随后以chatGPT为代表的大语言模型&#x…

掌握Hive函数[3]:从基础到高级应用

目录 窗口函数&#xff08;开窗函数&#xff09; 概述 常用窗口函数 1&#xff09;聚合函数 2&#xff09;跨行取值函数 &#xff08;1&#xff09;LEAD 和 LAG &#xff08;2&#xff09;FIRST_VALUE 和 LAST_VALUE 3&#xff09;排名函数 案例演示 1. 数据准备 1&…

数据库锁之行级锁、记录锁、间隙锁和临键锁

1. 行级锁 InnoDB 引擎支持行级锁&#xff0c;而MyISAM 引擎不支持行级锁&#xff0c;只支持表级锁。行级锁是基于索引实现的。 对于普通的select语句&#xff0c;是不会加记录锁的&#xff0c;因为它属于快照读&#xff0c;通过在MVCC中的undo log版本链实现。如果要在查询时对…

spring security 中的授权使用

一、认证 身份认证&#xff0c;就是判断一个用户是否为合法用户的处理过程。Spring Security 中支持多种不同方式的认证&#xff0c;但是无论开发者使用那种方式认证&#xff0c;都不会影响授权功能使用。因为 SpringSecurity 很好做到了认证和授权解耦。 二、授权 授权&#x…

【Anaconda】修改jupyter notebook默认打开的工作目录、jupyter notebook快捷键

jupyter notebook快捷键 针对单元格的颜色蓝色命令行模式绿色编辑模式 两种模式的切换编辑模式切换到命令行模式 >>> esc键命令行模式切换到编辑模式 >>> 鼠标左键或者直接按enter键1.标题的书写方式1:1.esc进入命令行模式2.按m键3.写内容4.运行单元格即可方…

基于SpringBoot的智能制造云平台系统的设计与实现计算机毕设

一、选题背景与意义&#xff08;300字左右&#xff09; 根据工业4.0智能制造生态链中云工厂在实际生产当中的工作流程进行充分调研和整理出来的&#xff0c;描述最终用户在本系统中对于生产订单的处理、排产、以及生产的完整在线处理流程和业务需求的文档。 针对制造业而言&a…

COD论文笔记 BiRefNet

本质还是一个 U 型编码器解码器结构的分割模型。 我可以考虑将©和(d)结合&#xff0c;即对解码器的输入不进行 patchify,同时在各个阶段引入梯度参考信息 最近的相关工作&#xff0c;中间监督、额外先验(频率&#xff0c;梯度&#xff0c;边缘等)取得不错效果 作者观察到…

【数据分享】《中国城市统计年鉴》(1985-2023)全PDF版本 第一次补档

数据介绍 中国城市&#xff0c;如同一本生动的历史书&#xff0c;承载着经济、社会的快速变迁。《中国城市统计年鉴》记录了城市的发展轨迹&#xff0c;是我们理解城市化进程、洞察城市挑战的重要指南。 这份年鉴的数据庞大而详实&#xff0c;囊括了中国城市发展的多个方面。…

二、Maven工程的创建--JavaSEJavaEE

1、idea创建Maven JavaSE工程&#xff1a; 2、idea创建Maven JavaEE工程&#xff1a; &#xff08;1&#xff09;手动创建 &#xff08;2&#xff09;插件方式创建 在idea里安装插件JBLJavaToWeb&#xff1b; 选择需要生成的项目文件后&#xff0c;右击&#xff1a; 项目…

【verilog】1. 流水灯例程

文章目录 前言一、定义概念 缩写1. verilog 二、性质三、代码分解释四、完整代码参考文献 前言 数电课设 一、定义概念 缩写 1. verilog Verilog 是一种以代码形式来描述数字系统和电路的硬件描述语言 (HDL)。它由 Gateway Design Automation 在 20 世纪 80年代中期开发&a…

【Linux】进程控制(一)

1. 进程创建 &#xff08;一&#xff09;认识fork函数 从已存在进程中创建一个新进程&#xff08;新进程为子进程&#xff0c;而原进程为父进程&#xff09; 进程调用fork&#xff0c;当控制转移到内核中的fork代码后&#xff0c;内核做&#xff1a; 分配新的内存块和内核数…

JVM 调优篇1 类的加载器与加载过程

一 基本知识 1.1 JIT&AOT JIT: Just Time compilation 即时编译器 在程序运行时将字节码或中间表示转换为机器代码。 AOT: Ahead of Tmie Compilation &#xff1a; 预编译 在程序运行之前将高级语言代码完全编译成机器代码。 1.2 字面量和符号引用* 字面量&am…

逻辑代数的基本规则

目录 逻辑代数的基本规则 带入规则 反演规则 对偶规则 逻辑代数的基本规则 带入规则 将逻辑等式两边的某一变量均用同一个逻辑函数代替&#xff0c;等式仍然成立。 可以用A非代替A&#xff0c;也可以用C代替B。 也可使用BC这样一个整体代替B。 反演规则 可以把与换或&#x…

Mysql高级教程

1.安装部署 安装依赖性&#xff1a; [rootmysql-node10 ~]# dnf install cmake gcc-c openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el7_4.x86_64.rpm rpcgen.x86_64 下载并解压源码包 [rootmysql-node10 ~]# tar zxf mysql-boost-5.7.44.tar.gz [rootmysql-no…

Java项目——苍穹外卖(一)

Entity、DTO、VO Entity&#xff08;实体&#xff09; Entity 是表示数据库表的对象&#xff0c;通常对应数据库中的一行数据。它通常包含与数据库表对应的字段&#xff0c;并可能包含一些业务逻辑。 DTO&#xff08;数据传输对象&#xff09; 作用&#xff1a;DTO 是用于在…

AutosarMCAL开发——基于EB Gpt驱动

目录 1.Gpt原理2.EB配置以及接口应用2.1 EB配置2.2 接口应用 3.总结 1.Gpt原理 autosar GPT模块&#xff08;General Purpose Timer&#xff0c;通用定时器&#xff09;主要用于汽车ECU中的时间测量、计数和产生定时中断。它支持单次性和周期性定时器&#xff0c;可以在达到预…

Bitvise——进入服务器的快捷方式

第一步&#xff1a;在连接进服务器后&#xff0c;点击左侧的保存配置文件&#xff0c;保存至桌面。 第二步&#xff1a;将保存的配置文件&#xff08;后缀为 .tlp&#xff09;打开方式改为bitvise。 第三步&#xff1a;双击配置文件&#xff08;后缀为 .tlp&#xff09;&#…

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理&#xff0c;在有一定基础认识的前提下&#xff0c;通过阅读kubelet源码&#xff0c;对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管…