Grant и TT верны, заявив, что на самом деле FIX не требует определенного порядка тегов (или полей) c, кроме как внутри повторяющихся групп.
Однако есть некоторые контрагенты, которым требуется определенное c упорядочение полей в теле сообщения.
При настройке полей в сообщении QuickFIX / J упорядочивает теги в порядке их появления в словаре данных. Это связано с тем, что код для определенного типа сообщения c генерируется из словаря данных во время компиляции.
Если вы хотите изменить этот порядок, есть две возможности.
-
Изменить словарь данных и перекомпилировать QuickFIX / J. Инструкции здесь: инструкции по сборке
Расширьте общее Message
, укажите порядок тегов и передайте его супер-конструктору. Ниже приведен пример кода.
ПРИМЕЧАНИЕ: Думая об этом дальше, я понял, что у этого подхода есть и обратная сторона. В случае, если вашей стороне необходимо повторно отправить сообщения, сообщения из хранилища анализируются с использованием настроенного словаря данных и фабрики сообщений для этого сеанса. Т.е. вы, вероятно, в конечном итоге снова будете использовать порядок полей из словаря данных / сгенерированного кода.
Итак, чтобы подвести итог: вариант 1 является чистым подходом, но требует перестройки QuickFIX / J.
И общее примечание: обратите внимание, что вам не нужно добавлять количество повторяющихся групп (NoPartyIDs
в вашем коде) самостоятельно. Это делается QuickFIX / J при добавлении группы к сообщению.
Пример кода:
@Test
public void testCustomFieldOrder() {
final int[] FIELD_ORDER = {38, 55, 44, 1};
final int[] PARTY_GROUP_ORDER = {447, 452, 448, 0};
class MyNewOrderSingle extends quickfix.fix50sp1.Message {
public static final String MSGTYPE = "D";
public MyNewOrderSingle() {
super(FIELD_ORDER);
getHeader().setField(new quickfix.field.MsgType(MSGTYPE));
}
}
class MyPartyGroup extends Group {
public MyPartyGroup() {
super(453, 447, PARTY_GROUP_ORDER);
}
}
quickfix.fix50sp1.NewOrderSingle nos1 = new quickfix.fix50sp1.NewOrderSingle();
nos1.setString(38, "1000");
nos1.setString(55, "SYM");
nos1.setString(44, "1");
nos1.setString(1, "ACCOUNT");
nos1.setString(100, "XETR");
quickfix.fix50sp1.NewOrderSingle.NoPartyIDs group1 = new quickfix.fix50sp1.NewOrderSingle.NoPartyIDs();
group1.setString(447, "C");
group1.setString(452, "12");
group1.setString(448, "PARTYID");
nos1.addGroup(group1);
System.out.println("orig " + nos1.toString().replace('\001', '|'));
MyNewOrderSingle nos2 = new MyNewOrderSingle();
nos2.setString(38, "1000");
nos2.setString(55, "SYM");
nos2.setString(44, "1");
nos2.setString(1, "ACCOUNT");
nos2.setString(100, "XETR");
MyPartyGroup group2 = new MyPartyGroup();
group2.setString(447, "C");
group2.setString(452, "12");
group2.setString(448, "PARTYID");
nos2.addGroup(group2);
System.out.println("custom " + nos2.toString().replace('\001', '|'));
}
Вывод:
orig 8=FIXT.1.1|9=75|35=D|1=ACCOUNT|38=1000|44=1|55=SYM|100=XETR|453=1|448=PARTYID|447=C|452=12|10=014|
custom 8=FIXT.1.1|9=75|35=D|38=1000|55=SYM|44=1|1=ACCOUNT|100=XETR|453=1|447=C|452=12|448=PARTYID|10=014|