diff --git a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/AbstractSbeModel.java b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/AbstractSbeModel.java index 29843ebff..dc17b5ec1 100644 --- a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/AbstractSbeModel.java +++ b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/AbstractSbeModel.java @@ -5,7 +5,7 @@ import net.openhft.chronicle.bytes.BytesMarshallable; import net.openhft.chronicle.bytes.BytesOut; import net.openhft.chronicle.bytes.PointerBytesStore; -import open.vincentf13.service.spot.infra.alloc.ThreadContext; +import open.vincentf13.service.spot.infra.alloc.NativeUnsafeBuffer; import open.vincentf13.service.spot.sbe.MessageHeaderDecoder; import open.vincentf13.service.spot.sbe.MessageHeaderEncoder; import org.agrona.DirectBuffer; @@ -27,6 +27,7 @@ public abstract class AbstractSbeModel implements BytesMarshallable { protected final MessageHeaderEncoder headerEncoder = new MessageHeaderEncoder(); protected final MessageHeaderDecoder headerDecoder = new MessageHeaderDecoder(); protected final UnsafeBuffer internalBuffer = new UnsafeBuffer(0, 0); + protected final NativeUnsafeBuffer encodeBuffer = new NativeUnsafeBuffer(256); public void setGatewaySeq(long val) { this.seq = val; } public long getGatewaySeq() { return this.seq; } @@ -40,8 +41,8 @@ protected DirectBuffer wrapStore(PointerBytesStore store) { return internalBuffer; } - public void fillFromScratch(int length) { - fillFrom(ThreadContext.get().getScratchBuffer().buffer(), 0, length); + public void fillFromEncodeBuffer(int length) { + fillFrom(encodeBuffer.buffer(), 0, length); } public void fillFrom(open.vincentf13.service.spot.infra.alloc.aeron.AbstractAeronAlloc aeron) { diff --git a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/AuthCommand.java b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/AuthCommand.java index 1f63e6573..917e388ab 100644 --- a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/AuthCommand.java +++ b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/AuthCommand.java @@ -2,7 +2,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; -import open.vincentf13.service.spot.infra.alloc.ThreadContext; import open.vincentf13.service.spot.sbe.AuthDecoder; import open.vincentf13.service.spot.sbe.AuthEncoder; import org.agrona.DirectBuffer; @@ -24,9 +23,9 @@ public AuthDecoder decode() { } public void encode(long timestamp, long userId) { - MutableDirectBuffer buffer = ThreadContext.get().getScratchBuffer().wrapForWrite(); + MutableDirectBuffer buffer = encodeBuffer.wrapForWrite(); wrapHeader(buffer, AuthEncoder.TEMPLATE_ID, AuthEncoder.BLOCK_LENGTH, AuthEncoder.SCHEMA_ID, AuthEncoder.SCHEMA_VERSION); encoder.wrap(buffer, HEADER_SIZE).timestamp(timestamp).userId(userId); - fillFromScratch(HEADER_SIZE + encoder.encodedLength()); + fillFromEncodeBuffer(HEADER_SIZE + encoder.encodedLength()); } } diff --git a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/DepositCommand.java b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/DepositCommand.java index ff6b86cc5..740f0eae6 100644 --- a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/DepositCommand.java +++ b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/DepositCommand.java @@ -2,7 +2,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; -import open.vincentf13.service.spot.infra.alloc.ThreadContext; import open.vincentf13.service.spot.sbe.DepositDecoder; import open.vincentf13.service.spot.sbe.DepositEncoder; import org.agrona.DirectBuffer; @@ -24,9 +23,9 @@ public DepositDecoder decode() { } public void encode(long timestamp, long userId, int assetId, long amount) { - MutableDirectBuffer buffer = ThreadContext.get().getScratchBuffer().wrapForWrite(); + MutableDirectBuffer buffer = encodeBuffer.wrapForWrite(); wrapHeader(buffer, DepositEncoder.TEMPLATE_ID, DepositEncoder.BLOCK_LENGTH, DepositEncoder.SCHEMA_ID, DepositEncoder.SCHEMA_VERSION); encoder.wrap(buffer, HEADER_SIZE).timestamp(timestamp).userId(userId).assetId(assetId).amount(amount); - fillFromScratch(HEADER_SIZE + encoder.encodedLength()); + fillFromEncodeBuffer(HEADER_SIZE + encoder.encodedLength()); } } diff --git a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderAcceptedReport.java b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderAcceptedReport.java index afcca0cea..299b07dea 100644 --- a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderAcceptedReport.java +++ b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderAcceptedReport.java @@ -3,8 +3,10 @@ import lombok.Data; import lombok.EqualsAndHashCode; import open.vincentf13.service.spot.sbe.ExecutionReportDecoder; +import open.vincentf13.service.spot.sbe.ExecutionReportEncoder; import open.vincentf13.service.spot.sbe.OrderStatus; import org.agrona.DirectBuffer; +import org.agrona.MutableDirectBuffer; /** * 訂單接受回報 @@ -12,6 +14,7 @@ @Data @EqualsAndHashCode(callSuper = true) public class OrderAcceptedReport extends AbstractSbeModel { + private final ExecutionReportEncoder encoder = new ExecutionReportEncoder(); private final ExecutionReportDecoder decoder = new ExecutionReportDecoder(); public ExecutionReportDecoder decode() { @@ -23,4 +26,11 @@ public ExecutionReportDecoder decode() { public void encode(long timestamp, long userId, long orderId, long clientOrderId) { encodeReport(timestamp, userId, orderId, OrderStatus.NEW, 0, 0, 0, 0, clientOrderId); } + + private void encodeReport(long timestamp, long userId, long orderId, OrderStatus status, long lastPrice, long lastQty, long cumQty, long avgPrice, long clientOrderId) { + MutableDirectBuffer buffer = encodeBuffer.wrapForWrite(); + wrapHeader(buffer, ExecutionReportEncoder.TEMPLATE_ID, ExecutionReportEncoder.BLOCK_LENGTH, ExecutionReportEncoder.SCHEMA_ID, ExecutionReportEncoder.SCHEMA_VERSION); + encoder.wrap(buffer, HEADER_SIZE).timestamp(timestamp).userId(userId).orderId(orderId).status(status).lastPrice(lastPrice).lastQty(lastQty).cumQty(cumQty).avgPrice(avgPrice).clientOrderId(clientOrderId); + fillFromEncodeBuffer(HEADER_SIZE + encoder.encodedLength()); + } } diff --git a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderCancelCommand.java b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderCancelCommand.java index e0036b674..f1b634abb 100644 --- a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderCancelCommand.java +++ b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderCancelCommand.java @@ -2,7 +2,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; -import open.vincentf13.service.spot.infra.alloc.ThreadContext; import open.vincentf13.service.spot.sbe.OrderCancelDecoder; import open.vincentf13.service.spot.sbe.OrderCancelEncoder; import org.agrona.DirectBuffer; @@ -24,9 +23,9 @@ public OrderCancelDecoder decode() { } public void encode(long timestamp, long userId, long orderId) { - MutableDirectBuffer buffer = ThreadContext.get().getScratchBuffer().wrapForWrite(); + MutableDirectBuffer buffer = encodeBuffer.wrapForWrite(); wrapHeader(buffer, OrderCancelEncoder.TEMPLATE_ID, OrderCancelEncoder.BLOCK_LENGTH, OrderCancelEncoder.SCHEMA_ID, OrderCancelEncoder.SCHEMA_VERSION); encoder.wrap(buffer, HEADER_SIZE).timestamp(timestamp).userId(userId).orderId(orderId); - fillFromScratch(HEADER_SIZE + encoder.encodedLength()); + fillFromEncodeBuffer(HEADER_SIZE + encoder.encodedLength()); } } diff --git a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderCanceledReport.java b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderCanceledReport.java index 91726dd21..bbf5508ed 100644 --- a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderCanceledReport.java +++ b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderCanceledReport.java @@ -3,8 +3,10 @@ import lombok.Data; import lombok.EqualsAndHashCode; import open.vincentf13.service.spot.sbe.ExecutionReportDecoder; +import open.vincentf13.service.spot.sbe.ExecutionReportEncoder; import open.vincentf13.service.spot.sbe.OrderStatus; import org.agrona.DirectBuffer; +import org.agrona.MutableDirectBuffer; /** * 訂單撤單回報 @@ -12,6 +14,7 @@ @Data @EqualsAndHashCode(callSuper = true) public class OrderCanceledReport extends AbstractSbeModel { + private final ExecutionReportEncoder encoder = new ExecutionReportEncoder(); private final ExecutionReportDecoder decoder = new ExecutionReportDecoder(); public ExecutionReportDecoder decode() { @@ -23,4 +26,11 @@ public ExecutionReportDecoder decode() { public void encode(long timestamp, long userId, long orderId, long filledQuantity, long clientOrderId) { encodeReport(timestamp, userId, orderId, OrderStatus.CANCELED, 0, 0, filledQuantity, 0, clientOrderId); } + + private void encodeReport(long timestamp, long userId, long orderId, OrderStatus status, long lastPrice, long lastQty, long cumQty, long avgPrice, long clientOrderId) { + MutableDirectBuffer buffer = encodeBuffer.wrapForWrite(); + wrapHeader(buffer, ExecutionReportEncoder.TEMPLATE_ID, ExecutionReportEncoder.BLOCK_LENGTH, ExecutionReportEncoder.SCHEMA_ID, ExecutionReportEncoder.SCHEMA_VERSION); + encoder.wrap(buffer, HEADER_SIZE).timestamp(timestamp).userId(userId).orderId(orderId).status(status).lastPrice(lastPrice).lastQty(lastQty).cumQty(cumQty).avgPrice(avgPrice).clientOrderId(clientOrderId); + fillFromEncodeBuffer(HEADER_SIZE + encoder.encodedLength()); + } } diff --git a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderCreateCommand.java b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderCreateCommand.java index 453db3b7a..856fcd0ce 100644 --- a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderCreateCommand.java +++ b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderCreateCommand.java @@ -2,7 +2,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; -import open.vincentf13.service.spot.infra.alloc.ThreadContext; import open.vincentf13.service.spot.sbe.OrderCreateDecoder; import open.vincentf13.service.spot.sbe.OrderCreateEncoder; import open.vincentf13.service.spot.sbe.Side; @@ -25,9 +24,9 @@ public OrderCreateDecoder decode() { } public void encode(long timestamp, long userId, int symbolId, long price, long qty, Side side, long clientOrderId) { - MutableDirectBuffer buffer = ThreadContext.get().getScratchBuffer().wrapForWrite(); + MutableDirectBuffer buffer = encodeBuffer.wrapForWrite(); wrapHeader(buffer, OrderCreateEncoder.TEMPLATE_ID, OrderCreateEncoder.BLOCK_LENGTH, OrderCreateEncoder.SCHEMA_ID, OrderCreateEncoder.SCHEMA_VERSION); encoder.wrap(buffer, HEADER_SIZE).timestamp(timestamp).userId(userId).symbolId(symbolId).price(price).qty(qty).side(side).clientOrderId(clientOrderId); - fillFromScratch(HEADER_SIZE + encoder.encodedLength()); + fillFromEncodeBuffer(HEADER_SIZE + encoder.encodedLength()); } } diff --git a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderMatchReport.java b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderMatchReport.java index d5a29e7f4..f1586f685 100644 --- a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderMatchReport.java +++ b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderMatchReport.java @@ -3,8 +3,10 @@ import lombok.Data; import lombok.EqualsAndHashCode; import open.vincentf13.service.spot.sbe.ExecutionReportDecoder; +import open.vincentf13.service.spot.sbe.ExecutionReportEncoder; import open.vincentf13.service.spot.sbe.OrderStatus; import org.agrona.DirectBuffer; +import org.agrona.MutableDirectBuffer; /** * 訂單成交回報 @@ -12,6 +14,7 @@ @Data @EqualsAndHashCode(callSuper = true) public class OrderMatchReport extends AbstractSbeModel { + private final ExecutionReportEncoder encoder = new ExecutionReportEncoder(); private final ExecutionReportDecoder decoder = new ExecutionReportDecoder(); public ExecutionReportDecoder decode() { @@ -23,4 +26,11 @@ public ExecutionReportDecoder decode() { public void encode(long timestamp, long userId, long orderId, OrderStatus status, long lastPrice, long lastQty, long cumQty, long avgPrice, long clientOrderId) { encodeReport(timestamp, userId, orderId, status, lastPrice, lastQty, cumQty, avgPrice, clientOrderId); } + + private void encodeReport(long timestamp, long userId, long orderId, OrderStatus status, long lastPrice, long lastQty, long cumQty, long avgPrice, long clientOrderId) { + MutableDirectBuffer buffer = encodeBuffer.wrapForWrite(); + wrapHeader(buffer, ExecutionReportEncoder.TEMPLATE_ID, ExecutionReportEncoder.BLOCK_LENGTH, ExecutionReportEncoder.SCHEMA_ID, ExecutionReportEncoder.SCHEMA_VERSION); + encoder.wrap(buffer, HEADER_SIZE).timestamp(timestamp).userId(userId).orderId(orderId).status(status).lastPrice(lastPrice).lastQty(lastQty).cumQty(cumQty).avgPrice(avgPrice).clientOrderId(clientOrderId); + fillFromEncodeBuffer(HEADER_SIZE + encoder.encodedLength()); + } } diff --git a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderRejectedReport.java b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderRejectedReport.java index 6ca983b8e..ef28f1a28 100644 --- a/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderRejectedReport.java +++ b/service/spot-exchange/spot-infra/src/main/java/open/vincentf13/service/spot/model/command/OrderRejectedReport.java @@ -3,8 +3,10 @@ import lombok.Data; import lombok.EqualsAndHashCode; import open.vincentf13.service.spot.sbe.ExecutionReportDecoder; +import open.vincentf13.service.spot.sbe.ExecutionReportEncoder; import open.vincentf13.service.spot.sbe.OrderStatus; import org.agrona.DirectBuffer; +import org.agrona.MutableDirectBuffer; /** * 訂單拒絕回報 @@ -12,6 +14,7 @@ @Data @EqualsAndHashCode(callSuper = true) public class OrderRejectedReport extends AbstractSbeModel { + private final ExecutionReportEncoder encoder = new ExecutionReportEncoder(); private final ExecutionReportDecoder decoder = new ExecutionReportDecoder(); public ExecutionReportDecoder decode() { @@ -23,4 +26,11 @@ public ExecutionReportDecoder decode() { public void encode(long timestamp, long userId, long clientOrderId) { encodeReport(timestamp, userId, 0, OrderStatus.REJECTED, 0, 0, 0, 0, clientOrderId); } + + private void encodeReport(long timestamp, long userId, long orderId, OrderStatus status, long lastPrice, long lastQty, long cumQty, long avgPrice, long clientOrderId) { + MutableDirectBuffer buffer = encodeBuffer.wrapForWrite(); + wrapHeader(buffer, ExecutionReportEncoder.TEMPLATE_ID, ExecutionReportEncoder.BLOCK_LENGTH, ExecutionReportEncoder.SCHEMA_ID, ExecutionReportEncoder.SCHEMA_VERSION); + encoder.wrap(buffer, HEADER_SIZE).timestamp(timestamp).userId(userId).orderId(orderId).status(status).lastPrice(lastPrice).lastQty(lastQty).cumQty(cumQty).avgPrice(avgPrice).clientOrderId(clientOrderId); + fillFromEncodeBuffer(HEADER_SIZE + encoder.encodedLength()); + } }