Donc groupes répétitifs ne sont pas pas cher pour analyser et il est une faiblesse connue du protocole FIX. Heureusement, la plupart des messages FIX sensibles (comme ExecutionReport
) ne contiendront aucun groupe répétitif. Cela devient encore pire quand vous avez des groupes répétés à l'intérieur des groupes de répétition. L'astuce consiste à essayer d'analyser les groupes répétitifs uniquement pour les types de message que vous connaissez peuvent contenir des groupes répétitifs, en ignorant les groupes récurrents pour tous les autres types de message lorsqu'il s'agit d'analyser.
Ci-dessous un exemple de la façon dont vous pouvez analyser les groupes répéter avec CoralFIX:
FixParser parser = new FixParser();
// define a repeating group for a message type:
parser.addGroupTemplate(QuoteStatusRequest, NoRelatedSym,
Symbol, FutSettDate, SecurityDesc);
FixMessage fixMsg = parser.parse(byteBufferWithFixMessage);
fixGroup = fixMsg.getGroup(NoRelatedSym);
System.out.println(fixGroup.getNumberOfElements()); // => 4
// you can also print the whole fix group for debugging purposes:
System.out.println(fixGroup);
// Symbol(55)=AAPL FutSettDate(64)=1 SecurityDesc(107)=blah1 | Symbol(55)=IBM FutSettDate(64)=2 SecurityDesc(107)=blah2 | Symbol(55)=LDK FutSettDate(64)=3 SecurityDesc(107)=blah3 | Symbol(55)=FB FutSettDate(64)=4 SecurityDesc(107)=blah4
System.out.println();
Iterator<FixGroupElement> iter = fixGroup.iterator();
while(iter.hasNext()) {
FixGroupElement elem = iter.next();
// fetch fix tag values as usual:
System.out.println(elem.getString(Symbol));
System.out.println(elem.getInt("FutSettDate"));
System.out.println(elem.getString(107));
// you can also print the whole element for debugging purposes:
System.out.println(elem);
System.out.println();
}
}
Ainsi, vous pouvez voir ci-dessus que nous indiquons explicitement à l'analyseur que le type de message QuoteStatusRequest
peut contenir un groupe répétitif défini par tag NoRelatedSym
et les étiquettes de correction Symbol
, FutSettDate
et SecurityDesc
. Les autres types de message n'auront aucun surcoût dans l'analyseur en raison de ce groupe répétitif. Vous pouvez en savoir plus sur le code source ci-dessus here. Maintenant, en ce qui concerne les détails d'implémentation, vous avez besoin de la récursivité, en particulier pour gérer les groupes répétitifs à l'intérieur de groupes répétitifs. La récursivité rend la mise en œuvre beaucoup plus claire à suivre et à comprendre. Cela peut aussi être fait par itération mais le code devient trop compliqué pour juste un peu plus de performance (nanos). Cela ferait plus de différence si vous aviez trop de groupes répétitifs à l'intérieur de groupes répétitifs. J'ai particulièrement vu seulement 2 niveaux d'imbrication quand il s'agit de groupes répétitifs FIX, mais le protocole permet n'importe quel niveau d'imbrication.
Avertissement: Je suis l'un des développeurs de CoralFIX.
http://www.quickfixj.org/quickfixj/usermanual/1.5.3/usage/repeating_groups.html –