QuickFIX/J 消息破解问题 - onMessage() 处理程序未被调用
QuickFIX/J message cracking problem - onMessage() handler not being called
我在 QuickFIX/J 消息破解方面遇到问题。我的消息破解后的消息处理程序无法正常工作。
我已经像link一样实现了消息破解(代码在下面)https://www.quickfixj.org/usermanual/2.3.0/usage/receiving_messages.html
当我调试代码时,找不到库端的 invoker 实例。所以 UnsupportedMessageType
被抛出。
调试代码:
项目Settings/Codes:
gradle 依赖关系:
implementation group: 'org.quickfixj', name: 'quickfixj-all', version: '2.3.0'
初始化:
SessionSettings settings = new SessionSettings(MyClass.class.getClassLoader().getResourceAsStream("Server.cfg"));
MessageStoreFactory storeFactory = new FileStoreFactory(settings);
LogFactory logFactory = new FileLogFactory(settings);
MessageFactory messageFactory = new DefaultMessageFactory();
SocketAcceptor socketAcceptor = new SocketAcceptor(fixApplication, storeFactory, settings, logFactory, messageFactory);
承兑人代码:
...
public class FixApplication extends MessageCracker implements Application {
...
@Override
public void fromApp(Message message, SessionID sessionId) throws FieldNotFound, IncorrectTagValue, UnsupportedMessageType {
crack(message, sessionId);
}
public void onMessage(quickfix.fix50sp2.NewOrderSingle order, SessionID sessionId) throws FieldNotFound, IncorrectTagValue {
// expecting message cracker will call this handler on NewOrderSingle message
}
...
}
如您所见,我正在使用 quickfix.fix50sp2.NewOrderSingle
。
这是 NewOrderSingle 的示例交易。我收到 Unsupported Message Type
错误。
< 8=FIXT.1.1|9=132|35=D|49=SENDER_ID|56=TARGET_ID|34=2|52=20210818-20:46:50|11=899094438|21=1|55=ERICB.ST|54=1|60=20210818-20:46:50|40=2|44=50|38=1000|10=117|
> 8=FIXT.1.1|9=106|35=j|34=2|49=TARGET_ID|52=20210818-20:46:50.096|56=SENDER_ID|45=2|58=Unsupported Message Type|372=D|380=3|10=000|
配置文件:
[default]
FileStorePath=server/data/acceptor
FileLogPath=server/log/acceptor
ConnectionType=acceptor
SenderCompID=XXX
SocketConnectHost=localhost
StartTime=00:00:00
EndTime=00:00:00
HeartBtInt=30
ReconnectInterval=5
BeginString=FIXT.1.1
DefaultApplVerID=FIX.5.0SP2
TransportDataDictionary=spec/FIXT11.xml
AppDataDictionary=spec/FIX50SP2.xml
UseDataDictionary=Y
ValidOrderTypes=1,2
问题:
- 我该如何解决这个问题?所以在
crack(quickfix.Message message, SessionID sessionID)
操作之后可以调用我的 onMessage(quickfix.fix50sp2.NewOrderSingle order, SessionID sessionId)
处理程序。
谢谢。
问题与本地字符设置有关。我在 Windows 将本地语言设置更改为美国,问题已解决。
详情如下:
在 DeafultMessageFactory
上加载工厂消息时 class 名称被隐藏为
- quickfix.fıx...MessageFactory <-- 注意:fıx 而不是 fix
应该是
- quickfix.fix...MessageFactory
当原始修复消息在工厂中转换为相关修复消息(如 quickfix.fix41.NewOrderSingle
)时,它并没有完全转换。而是返回通用 quickfix.Message
。
@Christoph John,感谢您的帮助。
我在 QuickFIX/J 消息破解方面遇到问题。我的消息破解后的消息处理程序无法正常工作。
我已经像link一样实现了消息破解(代码在下面)https://www.quickfixj.org/usermanual/2.3.0/usage/receiving_messages.html
当我调试代码时,找不到库端的 invoker 实例。所以 UnsupportedMessageType
被抛出。
调试代码:
项目Settings/Codes:
gradle 依赖关系:
implementation group: 'org.quickfixj', name: 'quickfixj-all', version: '2.3.0'
初始化:
SessionSettings settings = new SessionSettings(MyClass.class.getClassLoader().getResourceAsStream("Server.cfg"));
MessageStoreFactory storeFactory = new FileStoreFactory(settings);
LogFactory logFactory = new FileLogFactory(settings);
MessageFactory messageFactory = new DefaultMessageFactory();
SocketAcceptor socketAcceptor = new SocketAcceptor(fixApplication, storeFactory, settings, logFactory, messageFactory);
承兑人代码:
...
public class FixApplication extends MessageCracker implements Application {
...
@Override
public void fromApp(Message message, SessionID sessionId) throws FieldNotFound, IncorrectTagValue, UnsupportedMessageType {
crack(message, sessionId);
}
public void onMessage(quickfix.fix50sp2.NewOrderSingle order, SessionID sessionId) throws FieldNotFound, IncorrectTagValue {
// expecting message cracker will call this handler on NewOrderSingle message
}
...
}
如您所见,我正在使用 quickfix.fix50sp2.NewOrderSingle
。
这是 NewOrderSingle 的示例交易。我收到 Unsupported Message Type
错误。
< 8=FIXT.1.1|9=132|35=D|49=SENDER_ID|56=TARGET_ID|34=2|52=20210818-20:46:50|11=899094438|21=1|55=ERICB.ST|54=1|60=20210818-20:46:50|40=2|44=50|38=1000|10=117|
> 8=FIXT.1.1|9=106|35=j|34=2|49=TARGET_ID|52=20210818-20:46:50.096|56=SENDER_ID|45=2|58=Unsupported Message Type|372=D|380=3|10=000|
配置文件:
[default]
FileStorePath=server/data/acceptor
FileLogPath=server/log/acceptor
ConnectionType=acceptor
SenderCompID=XXX
SocketConnectHost=localhost
StartTime=00:00:00
EndTime=00:00:00
HeartBtInt=30
ReconnectInterval=5
BeginString=FIXT.1.1
DefaultApplVerID=FIX.5.0SP2
TransportDataDictionary=spec/FIXT11.xml
AppDataDictionary=spec/FIX50SP2.xml
UseDataDictionary=Y
ValidOrderTypes=1,2
问题:
- 我该如何解决这个问题?所以在
crack(quickfix.Message message, SessionID sessionID)
操作之后可以调用我的onMessage(quickfix.fix50sp2.NewOrderSingle order, SessionID sessionId)
处理程序。
谢谢。
问题与本地字符设置有关。我在 Windows 将本地语言设置更改为美国,问题已解决。
详情如下:
在 DeafultMessageFactory
上加载工厂消息时 class 名称被隐藏为
- quickfix.fıx...MessageFactory <-- 注意:fıx 而不是 fix
应该是
- quickfix.fix...MessageFactory
当原始修复消息在工厂中转换为相关修复消息(如 quickfix.fix41.NewOrderSingle
)时,它并没有完全转换。而是返回通用 quickfix.Message
。
@Christoph John,感谢您的帮助。