项目地址http://www.quickfixengine.org/:
1.开始:
大多数我们关系的消息都会到达我们重载的fromApp函数中。你可以从具有不同类型(type)安全度的消息中得到field。这里的type指的是Fix消息的type。当程序传给你一个Message类,C++ type checker不知道它是神马特定的Fix消息,你必须动态决定。然而,这里有个办法使C++知道类型信息。首先,我们会介绍如何从消息中动态查询fields,然后我们将展示更好的类型安全方式。记住:所有消息都有头header和尾trailer。如果你想在里面看他们的fields,你必须首先调用getHeader() or getTrailer()来获取他们。否则没戏。
1.2最弱类型安全:
这种收集数据的方法被强烈建议不去使用,而且只在为一些其他语言或者中间件写底层接口时有用。
这里有一些收集数据的代码片段:
void fromApp( const FIX::Message& message, const FIX::SessionID& sessionID )
throw( FIX::FieldNotFound&, FIX::IncorrectDataFormat&, FIX::IncorrectTagValue&, FIX::UnsupportedMessageType& )
{
// retreive value into string with integer field ID
std::string value;
value = message.getField(44);
// retrieve value into a field base with integer field ID
FIX::FieldBase field(44, "");
message.getField(field);
// retreive value with an enumeration, a little better
message.getField(FIX::FIELD::Price);
}
一种增加一些类型安全的方法是用一个field类来表示所有的Fix定义Fields。这在程序中有时有用,但只在无版本依赖的代码片段中有用。比如,我们的session类在这用的最多。在多数程序中不推荐用它。这也将得到一些field,不只是string。
void fromApp( const FIX::Message& message, const FIX::SessionID& sessionID )
throw( FIX::FieldNotFound&, FIX::IncorrectDataFormat&, FIX::IncorrectTagValue&, FIX::UnsupportedMessageType& )
{
// retreive value into field class
FIX::Price price;
message.getField(price);
// another field...
FIX::ClOrdID clOrdID;
message.getField(clOrdID);
}
1.4 最高安全(这样做)
QuickFIX有用来收集协议定义的所有消息的消息类。他们就如同field类,由Fix协议直接产生。利用这种优势,你必须用提供的MessageCracker来分解出消息。而且我们不在用泛型消息类,现在我们用using来代替getField。记住:你仍能像这些类从消息导出数据一样用getField来导出数据。
void fromApp( const FIX::Message& message, const FIX::SessionID& sessionID )
throw( FIX::FieldNotFound&, FIX::IncorrectDataFormat&, FIX::IncorrectTagValue&, FIX::UnsupportedMessageType& )
{
crack(message, sessionID);
}
void onMessage( const FIX42::NewOrderSingle& message, const FIX::SessionID& )
{
FIX::ClOrdID clOrdID;
message.get(clOrdID);
FIX::ClearingAccount clearingAccount;
message.get(clearingAccount);
}
void onMessage( const FIX41::NewOrderSingle& message, const FIX::SessionID& )
{
FIX::ClOrdID clOrdID;
message.get(clOrdID);
// compile time error!! field not defined in FIX41
FIX::ClearingAccount clearingAccount;
message.get(clearingAccount);
}
void onMessage( const FIX42::OrderCancelRequest& message, const FIX::SessionID& )
{
FIX::ClOrdID clOrdID;
message.get(clOrdID);
// compile time error!! field not defined for OrderCancelRequest
FIX::Price price;
message.get(price);
}
你必须用MessageCracker作为maxin来用上面的方法。它将为你提供crack函数,允许你重载这个消息函数。任何你没有重载的函数将会利用default ,而且遇到未定义类型会抛出异常。
你可以这样定义你的程序:
#include "quickfix/Application.h"
#include "quickfix/MessageCracker.h"
class MyApplication
: public FIX::Application,
public FIX::MessageCracker