package com.example.trading.gateway.fix; import com.example.trading.gateway.order.FixOrderMapper; import com.example.trading.gateway.order.IncomingOrder; import com.example.trading.gateway.order.OrderValidationException; import com.example.trading.gateway.application.OrderSubmission; import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import quickfix.FieldNotFound; import quickfix.MessageCracker; import quickfix.SessionID; import quickfix.field.ClOrdID; import quickfix.fix44.NewOrderSingle; /** Callback performs only in-memory parsing and nonblocking bounded submission. */ public class GatewayOrderMessageHandler extends MessageCracker { private static final Logger log = LoggerFactory.getLogger(GatewayOrderMessageHandler.class); private final FixOrderMapper mapper = new FixOrderMapper(); private final OrderSubmission orders; public GatewayOrderMessageHandler(OrderSubmission orders) { this.orders = Objects.requireNonNull(orders); } public void onMessage(NewOrderSingle message, SessionID sessionId) throws FieldNotFound { IncomingOrder order; try { order = mapper.map(message); } catch (OrderValidationException invalidOrder) { log.warn("FIX order validation failed: SessionID={} ClOrdID={} reason={}", sessionId, message.getOptionalString(ClOrdID.FIELD).orElse(""), invalidOrder.getMessage()); // Invalid requests remain explicit errors, not fabricated OMS business decisions. return; } onOrder(order, sessionId); } protected void onOrder(IncomingOrder order, SessionID sessionId) { orders.submit(order, sessionId); // Processor records queue rejection explicitly. } }