#java #fix-protocol #quickfixj
#java #исправление-протокол #quickfixj
Вопрос:
Я работаю над разработкой решения для подключения к финансовому рынку с использованием протокола FIX с фреймворком quickfixj. В частности, я внедряю инициатор, и мне требуется для подключения к акцептору указать имя пользователя и пароль. В документации quickfixj в этом отношении не очень понятно, как передавать эти поля в сообщении для входа на сервер.
Просматривая, я обнаружил, что это заложено в функцию toAdmin, я поместил в эту функцию следующий код:
@Override
public void toAdmin(Message message, SessionID sessionId) {
Session.lookupSession(sessionId).setTargetDefaultApplicationVersionID(new ApplVerID("9"));
final Message.Header header = message.getHeader();
try {
if ( header.getField(new BooleanField(MsgType.FIELD)).equals(MsgType.LOGON) ) {
message.setField(new StringField(Username.FIELD, "user"));
message.setField( new StringField(Password.FIELD, "pass"));
System.out.println(">>> " message.toRawString());
}
} catch (FieldNotFound e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Но я все еще не могу выполнить процесс входа в систему, и он показывает мне следующий журнал при попытке входа в систему.
<20190313-14:44:33, FIXT.1.1:aaa->bbb, outgoing> (8=FIXT.1.1 9=74 35=A 34=1 49=aaa 52=20190313-14:44:33.431 56=bbb 98=0 108=30 1137=9 10=131 )
<20190313-14:44:33, FIXT.1.1:aaa->bbb, event> (Initiated logon request)
<20190313-14:44:33, FIXT.1.1:aaa->bbb, event> (Disconnecting: Encountered END_OF_STREAM)
<20190313-14:44:37, FIXT.1.1:aaa->bbb, event> (MINA session created: local=/192.168.1.80:51372, class org.apache.mina.transport.socket.nio.NioSocketSession, remote=/3.3.3.3:443)
<20190313-14:44:38, FIXT.1.1:aaa->bbb, outgoing> (8=FIXT.1.1 9=74 35=A 34=2 49=aaa 52=20190313-14:44:38.420 56=bbb 98=0 108=30 1137=9 10=135 )
<20190313-14:44:38, FIXT.1.1:aaa->bbb, event> (Initiated logon request)
<20190313-14:44:38, FIXT.1.1:aaa->bbb, event> (Disconnecting: Encountered END_OF_STREAM)
На некоторых форумах упоминается, что это может произойти, когда имя пользователя и пароль переданы неправильно
Вопросы:
- Кто-то использовал quickfixj, передавая имя пользователя и пароль для аутентификации в акцепторе, который мог бы мне помочь.
- Показанное сообщение об ошибке может иметь какую-то другую причину, которую кто-то знает?
Комментарии:
1. Вы близки к истине, но
header.getField(new BooleanField(MsgType.FIELD))
ошибаетесь. Вам не нужно логическое значение!
Ответ №1:
Начиная с QuickFix / J 2.2.0, вы можете передавать LogonTag
настройки сеанса, чтобы установить эти теги в отправляемом сообщении входа в систему.
Пример:
LogonTag=553=user
LogonTag1=554=password
Комментарии:
1. Пожалуйста, не могли бы вы предоставить более подробную информацию? у меня это не работает
2. Это определенно работает. Вы уверены, что используете QuickFix / J (т.Е. порт Java ) как минимум в версии 2.2.0?
3. я использую wso2, при попытке обновления до 2.2.0 я получаю следующую ошибку: quickfix.ConfigError: FIX44.xml : Свойство ‘ javax.xml.XMLConsta nts/property/accessExternalDTD’ не распознано. и сообщение о входе в систему даже не отправляется, но в более старой версии имя пользователя не считывается, но отправляется команда входа в систему.
4. Сообщение об ошибке является ошибкой в 2.2.0. Пожалуйста, попробуйте 2.3.0
5. все сработало нормально, спасибо, я вижу имя пользователя и пароль в команде fix. Однако я все еще получаю ответ на выход из системы: требуемый тег отсутствует, поле = 553 (хотя в сообщении присутствует 553) у вас есть какие-либо идеи, почему?
Ответ №2:
Это то, что вам нужно в вашем toAdmin()
:
final String msgType = msg.getHeader().getString(MsgType.FIELD);
if(MsgType.LOGON.compareTo(msgType) == 0)
{
msg.setString(quickfix.fields.Username.FIELD, _username);
msg.setString(quickfix.fields.Password.FIELD, _password);
}
Комментарии:
1. Он @Grant я воспользовался вашим предложением, спасибо, но проблема сохраняется даже. По крайней мере, решена проблема с именем пользователя и паролем.
2. Я ответил на вопрос, который вы задали. Это все, что я могу сделать. Задайте новый вопрос.