支付 定时任务

166 阅读3分钟

应用场景

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.如何处理数据 //基于线程池。每个数据,都由一个独立的线程去处理。这样可以提高并发处理速度。