Receiving Messages

Most of the messages you will be interested in looking at will be arriving in your FromApp function of your application. All messages have a header and trailer. If you want to get Header or Trailer fields, you must access those fields from the Header or Trailer embedded Struct. All other fields are accessible in the Body embedded struct.

QuickFIX/Go has a type for all messages and fields defined in the standard spec. The easiest and most typesafe method of receiving messages is by using the QuickFIX/Go MessageRouter generated message types. Any messages you do not establish routes for will by default return an UnsupportedMessageType reject.


import (
  "github.com/quickfixgo/quickfix"
  "github.com/quickfixgo/quickfix/field"
  "github.com/quickfixgo/quickfix/fix41/newordersingle"
)

type MyApplication struct {
  *quickfix.MessageRouter
}

func (m *MyApplication) init() {
  m.MessageRouter=quickfix.NewMessageRouter()
  m.AddRoute(newordersingle.Route(m.onNewOrderSingle))
}

func (m *MyApplication) FromApp(msg quickfix.Message, sessionID quickfix.SessionID) (err quickfix.MessageRejectError) {
  return m.Route(msg, sessionID)
}

func (m *MyApplication) onNewOrderSingle(msg newordersingle.NewOrderSingle, sessionID quickfix.SessionID) (err quickfix.MessageRejectError) {
  clOrdID, err := msg.GetClOrdID()
  if err != nil {
    return
  }

  //compile time error!! field not defined in FIX41
  clearingAccount, err := msg.GetClearingAccount()

  ...
  return
}

You can also bypass the MessageRouter and type safe classes by inspecting the Message directly. The preferred way of doing this is to use the QuickFIX/Go generated Field types.


func (m *MyApplication) FromApp(msg quickfix.Message, sessionID quickfix.SessionID) (err quickfix.MessageRejectError) {
  var price field.PriceField
  if err = msg.Body.Get(&field); err!=nil {
    return
  }

  ...
  return
}

Or you can go the least type safe route.


func (m *MyApplication) FromApp(msg quickfix.Message, sessionID quickfix.SessionID) (err quickfix.MessageRejectError) {
  var field quickfix.FIXString
  if err = msg.Body.GetField(quickfix.Tag(44), &field); err!=nil {
    return
  }

  ...
  return
}