Skip to main content

Publication

Data can be published on the platform by creating a message, setting its topic and payload, then calling session.publish(...).

Messages are mutable and reusable. Create them once where possible, then update the topic and payload before each publish.

Message Types​

Use the Messages factory to create messages for publication.

Message TypeCreate With
SBEMessages.sbe(...)
DTOMessages.dto(...)
FlexibleMessages.flexible(...)
CustomMessages.custom(...)
RawMessages.raw()

SBE Publication​

Publish an SBE message
SbeMessage<RfqEncoder, RfqDecoder> message = Messages.sbe(RfqEncoder.class);

ExpandableArrayBuffer buffer = new ExpandableArrayBuffer();
RfqEncoder encoder = new RfqEncoder();
encoder.wrapAndApplyHeader(buffer, 0, new MessageHeaderEncoder());
encoder.instrumentId("UST-10Y");
encoder.quantity(10_000_000);

message.topic(session.getApplicationName(), "rfq", "UST-10Y");
message.payloadEncoder(encoder);

Result result = session.publish(message);

DTO Publication​

Publish a DTO message
DtoMessage<PriceDto> message = Messages.dto(PriceDto.class);

PriceDto price = new PriceDto();
price.instrumentId("UST-10Y");
price.bidPrice(99.125);
price.askPrice(99.375);

message.topic(session.getApplicationName(), "price", price.instrumentId());
message.payload(price);

Result result = session.publish(message);

Flexible Publication​

Publish a flexible message
FlexibleMessage<Map<String, Object>> message = Messages.flexible(Map.class);

Map<String, Object> payload = new HashMap<>();
payload.put("instrument", "UST-10Y");
payload.put("price", 99.125);

message.topic(session.getApplicationName(), "price", "UST-10Y");
message.payload(payload);

Result result = session.publish(message);

Custom Publication​

Publish a custom message
CustomMessage<OrderUpdate> message = Messages.custom(OrderUpdate.class);

OrderUpdate update = new OrderUpdate();
update.setOrderId("order-1");
update.setStatus("Accepted");

message.topic(session.getApplicationName(), "order", update.getOrderId());
message.payload(update);

Result result = session.publish(message);

Raw Publication​

Publish a raw message
RawMessage message = Messages.raw();

int schemaId = 100;
int templateId = 1;
DirectBuffer buffer = new UnsafeBuffer("hello raw".getBytes(StandardCharsets.UTF_8));

message.topic(schemaId, templateId, session.getApplicationName(), "raw", "item-1");
message.payload(buffer, 0, buffer.capacity());

Result result = session.publish(message);

Publish Result​

The publish methods return a Result.

Result result = session.publish(message);
if (result.isFailure()) {
log.warn("Unable to publish: {}", result);
}

Some failures are transient, for example back pressure. Other failures, such as topic errors or authorization failures, indicate a problem that should be surfaced rather than retried forever.