> 文章列表 > coinex04 //数据库 初始化导入ringbuffer 并分配cpu

coinex04 //数据库 初始化导入ringbuffer 并分配cpu

coinex04 //数据库 初始化导入ringbuffer 并分配cpu

目录

4.0 逻辑树

4.1 数据加载器 -> 启动类 

4.2 实体类 -> 要操作的数据库表 

4.3 mappers -> EntrustOrderMapper.xml 

4.4 查询数据库中未被成交的委托单 -> service 和 serviceimpl 合在一起

4.5 使用disruptor 把数据分配给cpu 处理 -> for 循环 entrustOrders

4.6 数据转换 -> 多属性实体类 解耦 转成只用使用的属性的实体类

4.7 为 配置类 加载 依赖

4.8 yml文件配置

4.9 nacos-server:8848/nacos/#/login 文件配置

4.10 初始化数据启动类完整代码

4.11 数据初始化 最终分配处理


4.0 逻辑树

1. ringbuffer 构建完成
2. disraptor 构建完成
3. 数据初始化 -> 调用 ringbuffer  , disraptor

4.1 数据加载器 -> 启动类 

@Overridepublic void run(String... args) throws Exception { // 表示 match 一启动  就会执行这个
}

4.2 实体类 -> 要操作的数据库表 

match-service -> domain -> EntrustOrder

4.3 mappers -> EntrustOrderMapper.xml 

match-service -> resources -> mappers -> EntrustOrderMapper

4.4 查询数据库中未被成交的委托单 -> service 和 serviceimpl 合在一起

List<EntrustOrder> entrustOrders = entrustOrderMapper.selectList(new LambdaQueryWrapper<EntrustOrder>().eq(EntrustOrder::getStatus, 0).orderByAsc(EntrustOrder::getCreated));

4.5 使用disruptor 把数据分配给cpu 处理 -> for 循环 entrustOrders

StopWatch stopWatch = new StopWatch() ;stopWatch.start();for (EntrustOrder entrustOrder : entrustOrders) {disruptorTemplate.onData(BeanUtils.entrustOrder2Order(entrustOrder)); // 往ringbuffer 中放 // BeanUtils.entrustOrder2Order 数据转换} // BeanUtils.entrustOrder2Order(entrustOrder) 是数据转换 就是从entrustOrder  筛选出 Order 需要的属性数据stopWatch.stop();long lastTaskTimeMillis = stopWatch.getLastTaskTimeMillis();

4.6 数据转换 -> 多属性实体类 解耦 转成只用使用的属性的实体类

import org.example.domain.EntrustOrder;
import org.example.enums.OrderDirection;
import org.example.model.Order;public class BeanUtils {/*** 将EntrustOrder 转化为我们的Order* @param entrustOrder* @return*/public static  Order entrustOrder2Order(EntrustOrder entrustOrder) {Order order = new Order();order.setOrderId(entrustOrder.getId().toString());order.setPrice(entrustOrder.getPrice());order.setAmount(entrustOrder.getVolume().subtract(entrustOrder.getDeal())); // 交易的数量= 总数量- 已经成交的数量order.setSymbol(entrustOrder.getSymbol());order.setOrderDirection(OrderDirection.getOrderDirection(entrustOrder.getType().intValue()));order.setTime(entrustOrder.getCreated().getTime());return order ;}
}

4.7 为 配置类 加载 依赖

ps: @ConfigurationProperties(prefix = "spring.match") 这种配置类

 <!-- 在common 中       配置文件处理--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency>

4.8 yml文件配置

spring:match: symbols: # 根据 MatchEngineProperties 配置类 写相应参数BTCGCN:coinScale: 8baseCoinScale: 8ETHGCN:coinScale: 8baseCoinScale: 8

4.9 nacos-server:8848/nacos/#/login 文件配置

4.10 初始化数据启动类完整代码

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.example.disruptor.DisruptorTemplate;
import org.example.domain.EntrustOrder;
import org.example.mapper.EntrustOrderMapper;
import org.example.util.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StopWatch;import java.util.List;@Component // 放在容器里面
public class DataLoaderCmdRunner implements CommandLineRunner {@Autowiredprivate EntrustOrderMapper entrustOrderMapper ;// 查询委托单@Autowiredprivate DisruptorTemplate disruptorTemplate ; // 查询到的委托单 往ringbuffer 中放/*** 项目启动完毕后会执行该方法* @param args* @throws Exception*/@Overridepublic void run(String... args) throws Exception { // 表示 match 一启动  就会执行这个List<EntrustOrder> entrustOrders = entrustOrderMapper.selectList(new LambdaQueryWrapper<EntrustOrder>().eq(EntrustOrder::getStatus, 0).orderByAsc(EntrustOrder::getCreated));if(CollectionUtils.isEmpty(entrustOrders)){return;}StopWatch stopWatch = new StopWatch() ;stopWatch.start();for (EntrustOrder entrustOrder : entrustOrders) {disruptorTemplate.onData(BeanUtils.entrustOrder2Order(entrustOrder)); // 往ringbuffer 中放 // BeanUtils.entrustOrder2Order 数据转换} // BeanUtils.entrustOrder2Order(entrustOrder) 是数据转换 就是从entrustOrder  筛选出 Order 需要的属性数据stopWatch.stop();long lastTaskTimeMillis = stopWatch.getLastTaskTimeMillis();System.out.println("总条数:+"+entrustOrders.size()+" ,总共耗时:"+lastTaskTimeMillis+"ms");}}

4.11 数据初始化 最终分配处理

 @Overridepublic void onEvent(OrderEvent event, long sequence, boolean endOfBatch) throws Exception {// 从ringbuffer 里面接收了某个数据Order order = (Order)event.getSource(); // 强制转换成orderif(!order.getSymbol().equals(symbol)){ // symbol 是 上定义的 , 接收到的交易对 和 cpu交易对匹配return;}log.info("开始接收订单事件============>{}", event);MatchServiceFactory.getMatchService(MatchStrategy.LIMIT_PRICE).match(orderBooks ,order);log.info("处理完成我们的订单事件===================>{}", event);}