Skip to content

Enable traditional FIX engine message queuing (persist while disconnected) #303

@davidsteiner

Description

@davidsteiner

Summary

Currently, send_app_message() rejects messages with SendError::Disconnected when the session is not connected. Traditional FIX engines (like QuickFIX) instead persist messages with sequence numbers regardless of connection state, relying on the FIX resend mechanism for delivery.

Current Behavior

  • send_app_message() checks is_connected() and returns error if false
  • Messages attempted while disconnected are rejected - no sequence number, not persisted
  • Application must implement its own retry logic

Desired Behavior

  • Messages should be persisted with sequence numbers in all session states
  • When connected: message sent immediately on wire
  • When disconnected/awaiting logon/awaiting logout: message persisted, delivered via ResendRequest when peer reconnects and detects sequence gap
  • FIX protocol guarantees eventual delivery

Implementation Notes

The change is minimal because messages are already persisted BEFORE wire send in send_message():

  1. Remove is_connected() check in send_app_message() (session.rs lines 800-802)
  2. Change error! to debug! in SessionState::send_message() for AwaitingLogon and Disconnected states (state.rs lines 91, 101)
  3. Update SendOutcome::Sent documentation to clarify "persisted" rather than "transmitted"

The existing resend_messages() mechanism handles delivery when the peer sends a ResendRequest.

Affected Files

  • crates/hotfix/src/session.rs
  • crates/hotfix/src/session/state.rs
  • crates/hotfix/src/session/error.rs (docs only)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions