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 数据加载器 -> 启动类 

@Override
    public 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 entrustOrders = entrustOrderMapper.selectList(
                new LambdaQueryWrapper()
                        .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") 这种配置类

 
        
            org.springframework.boot
            spring-boot-configuration-processor
        

4.8 yml文件配置

spring:
   match: 
    symbols: # 根据 MatchEngineProperties 配置类 写相应参数
      BTCGCN:
        coinScale: 8
        baseCoinScale: 8
      
      ETHGCN:
        coinScale: 8
        baseCoinScale: 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 {


    @Autowired
    private EntrustOrderMapper entrustOrderMapper ;// 查询委托单

    @Autowired
    private DisruptorTemplate disruptorTemplate ; // 查询到的委托单 往ringbuffer 中放
    /**
     * 项目启动完毕后会执行该方法
     * @param args
     * @throws Exception
     */
    @Override
    public void run(String... args) throws Exception { // 表示 match 一启动  就会执行这个
        List entrustOrders = entrustOrderMapper.selectList(
                new LambdaQueryWrapper()
                        .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 数据初始化 最终分配处理

 @Override
    public void onEvent(OrderEvent event, long sequence, boolean endOfBatch) throws Exception {
        // 从ringbuffer 里面接收了某个数据
        Order order = (Order)event.getSource(); // 强制转换成order
        if(!order.getSymbol().equals(symbol)){ // symbol 是 上定义的 , 接收到的交易对 和 cpu交易对匹配
            return;
        }

        log.info("开始接收订单事件============>{}", event);

        MatchServiceFactory.getMatchService(MatchStrategy.LIMIT_PRICE).match(orderBooks ,order);

        log.info("处理完成我们的订单事件===================>{}", event);
    }

你可能感兴趣的:(coinex-功能,java,jvm,servlet)