3

What is the recommended way to convert a raw String, with one FIX message, to one QuickFIX/J Message object of the appropriate type, like one quickfix.fix44.ExecutionReport object?

I only have to deal with the FIX 4.4 version.

I found two options at this thread on Quickfixj-users mailing list.

I adapted these options to my situation and I was able to convert the message successfully in two different ways.

Example of a FIX message:

8=FIX.4.49=11035=834=749=EXEC52=20211014-19:39:25.75856=BANZAI6=011=114=10017=137=139=154=155=IBM150=2151=40010=237

I'd like to know which of the options below is better or if both are wrong and there's a better way.

Thanks in advance.

1 Option

quickfix.Message rawMessage = new quickfix.Message(rawMessageString);

// Example of MsgType = 8
MsgType msgType = new MsgType();
rawMessage.getHeader().getField(msgType);

MessageFactory messageFactory = new DefaultMessageFactory(ApplVerID.FIX44);

quickfix.Message message = messageFactory.create("FIX.4.4", msgType.getValue());

message.fromString(messageString, null, false, true);

// message.getName() = quickfix.fix44.ExecutionReport
System.out.println(message.getName() = " + message.getClass().getName());

2 Option

MessageFactory messageFactory = new DefaultMessageFactory(ApplVerID.FIX44);

quickfix.Message messageFromMessageUtils = quickfix.MessageUtils.parse(messageFactory, null, rawMessageString);

// message.getName() = quickfix.fix44.ExecutionReport
System.out.println("message.getName() = " + message.getClass().getName());

Data Dictionary

In the above tests, I didn't use a Data Dictionary, but in my real application I'll use one.

Ray
  • 13
  • 3
Felipe Windmoller
  • 1,528
  • 1
  • 12
  • 24

1 Answers1

4

What I especially dislike about option 1 is that you need to construct two messages. One for the extraction of the MsgType and afterwards the actual message. Seems unnecessary to me.

If you are only using FIX4.4 I would go for the second option because it does all the magic for you, i.e. extracts the needed things like BeginString and MsgType from the raw String.

Downside: it will only work up to and including FIX4.4 since MessageUtils.parse() does only consider the BeginString (not the ApplVerID). However, this should be no problem for your use case.

P.S.: If you ever need to parse messages for FIX5.0 and upwards, use the following (which is basically option 1 but without constructing a message to get the MsgType):

String msgType = MessageUtils.getMessageType(rawMessageString);
MessageFactory messageFactory = new DefaultMessageFactory(ApplVerID.FIX50);  // FIX5.0 for example
quickfix.Message message = messageFactory.create("FIXT.1.1", ApplVerID.FIX50, msgType);
message.fromString(rawMessageString, dd, false, true);

P.P.S.: Not of interest for your use case but for the sake of completeness: you could also use one of the quickfix.Message(String) constructors but that would not return you a message of the correct type. Just a general quickfix.Message.

Christoph John
  • 3,003
  • 2
  • 13
  • 23