目录
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 数据初始化 最终分配处理
1. ringbuffer 构建完成
2. disraptor 构建完成
3. 数据初始化 -> 调用 ringbuffer , disraptor
@Override
public void run(String... args) throws Exception { // 表示 match 一启动 就会执行这个
}
match-service -> domain -> EntrustOrder
match-service -> resources -> mappers -> EntrustOrderMapper
List entrustOrders = entrustOrderMapper.selectList(
new LambdaQueryWrapper()
.eq(EntrustOrder::getStatus, 0)
.orderByAsc(EntrustOrder::getCreated)
);
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();
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 ;
}
}
ps: @ConfigurationProperties(prefix = "spring.match") 这种配置类
org.springframework.boot
spring-boot-configuration-processor
spring:
match:
symbols: # 根据 MatchEngineProperties 配置类 写相应参数
BTCGCN:
coinScale: 8
baseCoinScale: 8
ETHGCN:
coinScale: 8
baseCoinScale: 8
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");
}
}
@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);
}