目录
1 生产者 数据源
1.1. match-server 一启动 初始化数据 自动查询数据库 查询level2要展示的数据
1.2 match-server接收 前端发给Exchange-server的数据
2. 将查询/接受的数据EntrustOrder 转成 Order 解耦 过滤掉不要的属性
3.Order转成 OrderEvent
4. 分配序号发布数据到ringbuffer,管理序号和栅栏(前提是ringbuffer构建好了)
5 分配序号 发布数据到ringbuffer
5.1. 初始化数据源实现的代码 循环每一条数据转换 分配序号 发布数据到ringbuffer
5.2 前端数据源
List<EntrustOrder> entrustOrders = entrustOrderMapper.selectList(new LambdaQueryWrapper<EntrustOrder>().eq(EntrustOrder::getStatus, 0).orderByAsc(EntrustOrder::getCreated)
@StreamListener("order_in") // "order_in" 在 Sink中public void handleMessage(EntrustOrder entrustOrder) { // 消息监听}
public static Order entrustOrder2Order(EntrustOrder entrustOrder) {Order order = new Order();order.Id().toString());order.Price());order.Volume().Deal())); // 交易的数量= 总数量- 已经成交的数量order.Symbol());order.Type().intValue())); // 交易sideorder.Created().getTime());return order ;}
// 使用事件转换器的好处,1环形队列获取序号, 2拿到事件填充数据, 3再发布序号 省了从2给 事件填充数据 private static final EventTranslatorOneArg<OrderEvent, Order> TRANSLATOR = new EventTranslatorOneArg<OrderEvent, Order>() { // Order 转化成 OrderEvent// 现在上面实例化 然后 在下面 实现/*** Translate a data representation into fields set in given event 将数据表示转换为给定事件中设置的字段* Params:参数* event* into which the data should be translated. 要转成什么data* sequence 序列* that is assigned to event. 分配给事件的序列。* arg0* The first user specified argument to the translator 转换器的第一个用户指定参数*/public void translateTo(OrderEvent event, long sequence, Order input) {event.setSource(input);} // setSource 是 source的 set方法};
/*** 我们使用DisruptorTemplate 时,就使用它的onData方法* @param input** public <A> void publishEvent(EventTranslatorOneArg<E, A> translator, A arg0)* {* final long sequence = ();* translateAndPublish(translator, sequence, arg0);* }* private <A> void translateAndPublish(EventTranslatorOneArg<E, A> translator, long sequence, A arg0)* {* try* {* anslateTo(get(sequence), sequence, arg0);* }* finally* {* sequencer.publish(sequence);* }* }** void publish(long sequence);**/public void onData(Order input) {ringBuffer.publishEvent(TRANSLATOR, input); // 这个就是分配序号 然后发布数据到ringbuffer}
for (EntrustOrder entrustOrder : entrustOrders) {ustOrder2Order(entrustOrder)); // 往ringbuffer 中放 // ustOrder2Order 数据转换} // ustOrder2Order(entrustOrder) 是数据转换 就是从entrustOrder 筛选出 Order 需要的属性数据
exchange-service 发送消息到match
ustOrder2Order(entrustOrder));
onData
public void onData(Order input) {ringBuffer.publishEvent(TRANSLATOR, input); // 这个就是分配序号 然后发布数据到ringbuffer}
TRANSLATOR
// 先用 EventTranslatorOneArg方法做了个 TRANSLATOR 再调用publishEvent方法
private static final EventTranslatorOneArg<OrderEvent, Order> TRANSLATOR = new EventTranslatorOneArg<OrderEvent, Order>() { // Order 转化成 OrderEventpublic void translateTo(OrderEvent event, long sequence, Order input) {event.setSource(input);} // setSource 是 source的 set方法};
publishEvent
@Overridepublic <A> void publishEvent(EventTranslatorOneArg<E, A> translator, A arg0){final long sequence = (); // 单生成者就是 但生产者中得next算法 1:43:28 // /?spm_id_from=333.337.search-card.all.click&vd_source=ff8b7f852278821525f11666b36f180atranslateAndPublish(translator, sequence, arg0);}
translateAndPublish
private <A> void translateAndPublish(EventTranslatorOneArg<E, A> translator, long sequence, A arg0){anslateTo(get(sequence), sequence, arg0);}finally{sequencer.publish(sequence);}}
EventTranslatorOneArg
public interface EventTranslatorOneArg<T, A>
{/*** Translate a data representation into fields set in given event** @param event into which the data should be translated.* @param sequence that is assigned to event.* @param arg0 The first user specified argument to the translator*/void translateTo(T event, long sequence, A arg0);
}
translateTo 自定义 还是调用?
private static final EventTranslatorOneArg<OrderEvent, Order> TRANSLATOR = new EventTranslatorOneArg<OrderEvent, Order>() { // Order 转化成 OrderEventpublic void translateTo(OrderEvent event, long sequence, Order input) {event.setSource(input);} // setSource 是 source的 set方法};
Sequencer
public interface Sequencer extends Cursored, Sequenced
{
}
Sequenced ->publish
public interface Sequenced
{/*** Publishes a sequence. Call when the event has been filled.** @param sequence the sequence to be published.*/void publish(long sequence); // 操作: publish 序号
}
本文发布于:2024-01-28 03:00:00,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063820074293.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |