应用场景
1.支付
2.转账
转账
主要步骤
1.入口类 //启动类,启动定时任务
2.spring配置文件 // 1.定时任务 2.bean
3.定时任务类 // 扫本地库
4.处理数据任务类 //处理数据。基于线程池,每个线程处理一个数据。
大的流程是,定时任务扫库(读数据)——》处理单个数据(处理数据)。
如何处理单个数据?
基于线程池。即每个线程处理一个数据。
数据如何传给线程?
自定义任务类实现Runnable接口。且携带数据。具体怎么携带数据?就是构建对象的时候,传进去。
代码
//自定义任务类
自定义类 implements Runnable{
数据; //
构造器(数据){ //提供构造器,传入数据
设置数据;
}
run(){
处理数据; //
}
}
//使用自定义任务类
spring定时任务类{
线程池;
execute(){
获取数据集合; //读本地数据库
for(数据集合){ //遍历
线程池.submit(new 自定义任务类(数据)); //每个数据,都有一个线程处理
}
}
}
支付
基本上,和转账差不多。但是因为支付的数据量更大,所以,除了使用定时任务 + 线程池,还有使用生产者 消费者模式。
即生产者 消费者,都是独立的服务。
生产者服务
生产者服务,就只有这一个类!
作用就是1.扫本地库 2.调用消费者服务,写数据到消费者的队列。
服务主要包含内容
1.入口类 //启动类,启动定时任务
2.spring配置文件 // 1.定时任务 2.bean
3.定时任务类 // 1.扫本地库 2.调用消费者服务(写数据到消费者的队列)。
4.处理数据任务类 //处理数据。基于线程池,每个线程处理一个数据。
消费者服务
主要有两个部分
1.数据来源
2.处理数据
数据来源
生产者调用消费者服务,往消费者服务的队列里写数据。
主要步骤
1.入口类 //启动类,启动定时任务
2.定时任务类 //读数据。从哪里读?消费者写过来的数据。
3.处理数据任务类 //处理数据。基于线程池,每个线程处理一个数据。
总结
和转账的区别?
1.用到了生产者 消费者模式 //本质还是基于微服务的思想,就是每个操作,都放到独立的服务。可以横向扩展集群。
2.既然使用了生产者 消费者模式,而且二者又是独立的服务,那么二者之间如何进行通信?
本质当然是调用远程服务,基于dubbo rpc。具体到细节来说,消费者服务使用了队列来存储数据。
具体是什么队列呢?并发链表队列。
总结
几个核心问题
1.架构,基本上差不多,大的步骤流程是一样的
2.要处理的数据,从哪里来 //即数据源是哪里?数据库,还是生产者服务?
3.如何传递数据 //即数据是如何流转的
4.如何处理数据 //基于线程池。每个数据,都由一个独立的线程去处理。这样可以提高并发处理速度。