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);}