Handle Order Modification (Cancel or Cancel/Replace)

Application needs to hook up to proper event handlers.

Create and add a FIXSessionOrderManagerCommonListener in FIXStandaloneApplicationListener.engineInitialized event handler.

    // Prerequisites: Variable "session" of type FIXSession.
    FIXSessionOrderManager sessionOM = FIXOrderManager.getSessionOrderManager(session);
    // Create an order cancel reject event handler
    // See FIXSessionOrderManagerCommonListener.orderCancelRejectAdded for more details.
    sessionOM.addCommonListener(listener);

In event handler, application can accept or reject the request or perform other required operations.

    public void orderReplaceRequestAdded(FIXOrder order,
            FIXMessage requestMessage, FIXEngineMessageHandlerStatus status) {
        if (order instanceof FIXRegularOrder) {
            FIXRegularOrder singleOrder = (FIXRegularOrder)order;
            // Make sure the session handler status is "Normal". It could be "Recovery", in which case no execution should be sent back.
            if (status == FIXEngineMessageHandlerStatus.NORMAL) {
                // Developer can implement their own way of generating "OrderID"
                String orderID = generateOrderID(requestMessage);
                // Example: Accept the request by sending back a "PendingCancel" execution.
                {
                    FIXMessage execMsg = singleOrder.createNewExecutionPendingReplace(requestMessage);
                    // Developer can implement their own way of generating "OrderID"
                    String execID = generateExecID(requestMessage);
                    execMsg.setValue(Tags.OrderID, orderID);
                    execMsg.setValue(Tags.ExecID, execID);
                    FIXMessageComponent lastExec = singleOrder.getLastExecution();
                    if (lastExec != null) {
                        execMsg.setValue(Tags.CumQty, lastExec.getFloatValue(Tags.CumQty));
                        execMsg.setValue(Tags.LeavesQty, lastExec.getFloatValue(Tags.LeavesQty));
                        execMsg.setValue(Tags.AvgPx, lastExec.getFloatValue(Tags.AvgPx));
                    else {
                        FIXMessageComponent curOrder = singleOrder.getCurrentOrder();
                        execMsg.setValue(Tags.CumQty, 0);
                        execMsg.setValue(Tags.LeavesQty, curOrder.getFloatValue(Tags.OrderQty));
                        execMsg.setValue(Tags.AvgPx, 0);
                    }
                    singleOrder.addExecution(execMsg);
                }
                // Another example: Reject the request by sending back "OrderCancelReject"
                {
                    FIXMessage cxlRej = singleOrder.createOrderCancelReject(requestMessage, singleOrder.getOrdStatus(), ValidValues.CxlRejReason.AlreadyPendingCxl, null);
                    cxlRej.setValue(Tags.OrderID, orderID);
                    singleOrder.addCancelReject(cxlRej);
                }
                // TODO: Implement your own business logic ...
            }
        }
    }        

This example works with FIX versions from 4.1 to 5.0+.