quickfixJ从会话对象获取会话设置

时间:2013-12-06 12:24:38

标签: quickfix fix-protocol quickfixj

我想通过添加当前会话设置中的用户名和密码值来自定义toAdmin方法中的已发送登录消息。这样的事情:

@Override
public void toAdmin(Message message, SessionID sessionId) {
    Header header = message.getHeader();
    if (!header.isSetField(MsgType.FIELD) || !header.getString(MsgType.FIELD).equals(MsgType.LOGON))
    {
        // not a logon message: do not modify it
        return;
    }

    Session session = Session.lookupSession(sessionId);           

    message.setField(new Username(seesion.getSettingValue("Username")));
    message.setField(new Password(seesion.getSettingValue("Password")));
}

getSettingValue方法不存在。有没有办法在quickfixJ中这样做?顺便说一下,这可以在quickfixn中使用。

3 个答案:

答案 0 :(得分:4)

我认为您的意思是要在配置文件中定义自定义用户名/密码设置。 (QF没有这些内置功能。)

此链接将向您展示如何使用自定义设置。 http://www.quickfixj.org/confluence/display/qfj/Using+Custom+Settings
(忽略散文中关于getSessionSettings()的一点;这种方法似乎并不存在于当前版本中。)

如果页面出现故障,简而言之就是这个过程:

以某种方式为您的MessageCracker应用程序提供对SessionSettings对象的引用(无论是通过构造函数还是get / set或者)。

toAdmin()中,执行以下操作:

final String msgType = msg.getHeader().getString(MsgType.FIELD);
if(MsgType.LOGON.compareTo(msgType) == 0)
{
    msg.setString(quickfix.fields.Username.FIELD,
      mySettings.getString(sessionID, "Username");
    msg.setString(quickfix.fields.Password.FIELD,
      mySettings.getString(sessionID, "Password");
}

(我还没有编译这段代码;如果我遇到语法错误,请告诉我,我会修复它。)

我昨天刚刚添加了与QF/n User FAQ等效的C#。你必须在QF / n邮件列表上,否则只是有很好的时机。

(我应该将其添加到QF/j User FAQ。)

答案 1 :(得分:1)

你确定你正朝着正确的方向前进。我刚刚检查了QuickfixJ文档中的Session 类。它没有任何数据成员用户名密码。因此,您无法提取任何不包含的值。

或者您使用的是特殊版本的Session类?我不认为Session应该持有任何这些数据,它是不必要的并且可以被恶意使用。我不确定同一方可以有多个用户ID和密码连接到另一方(同一个,我假设是因为你试图使用相同的会话ID来获取用户ID和密码),打开所有问题再来一次。

因此,如果您有一个用户ID /密码,最好从您可能正在使用的数据库或其他来源获取,而不是尝试从会话中获取它。

答案 2 :(得分:1)

你可以在QuickFIX / J中做类似的事情。看一下example的QFJ维基。您可以通过Session实施提供SessionSettings实例,然后使用该对象获取自定义设置,而不是通过Application访问会话设置。