2017-02-16 37 views
0

我是一個快速修復的新手但相信我,我徹底搜索了所有的論壇,並沒有找到解決方案到這種情況。我正在使用快速修復1.6庫。我有一個有重複組的FIX消息。當我使用sendToTarget()方法發送此消息時,該消息將被轉發到FIX服務器而沒有問題,但是由於哪些交換拒絕它,字段會重新排序。通過閱讀帖子,我知道使用數據字典將解決問題。但是,當我使用數據字典與相同的消息時,我得到「快速修復.InvalidMessage:等號在字段中找不到」異常。我知道這是根據數據字典的有效消息。以下是信息和代碼。有人可以請幫助。提前致謝。quickfix.InvalidMessage異常拋出即使有效的消息

FIX消息: 8 = FIXT.1.1 | 9 = 00331 | 35 = AE | 49 = AAA_FIX | 56 = BBB_FIX | 34 = 29 | 52 = 20170124-09:47:14 | 1041 = firm_trade_id_07 | 48 = XS0102233434 | 22 = 4 | 25004 = GBP | 470 = ZZ | 32 = 100 | 31 = 6.33 | 15 = GBP | 64 = 20170125 | 60 = 20170124-09:47:14 | 1430 = O | 574 = 1 | 487 = 0 | 552 = 2 | 54 = 1 | 528 = P | 29 = 4 | 581 = 3 | 453 = 1 | 448 = H7XNBB4851XX0REQ1F70 | 447 = N | 452 = 1 | 54 = 2 | 453 = 1 | 448 = 549300F2CCROIO4RRZ97 | 447 = N | 452 = 17 | 10 = 189 |


代碼:

BufferedReader reader = new BufferedReader(new FileReader ("Message.txt")); 
String line = null; 
StringBuilder stringBuilder = new StringBuilder(); 
String ls = System.getProperty("line.separator"); 

while((line = reader.readLine()) != null) { 
    stringBuilder.append(line); 
    stringBuilder.append(ls); 
} 

String messageString = stringBuilder.toString(); 
messageString = messageString.replace('|','\u0001'); 
Message FIXOrder = new Message(messageString, new DataDictionary("DD.xml")); 

-Cheers MJ

+0

什麼是重新排序?重複組內的標籤必須採用固定順序。不使用DataDictionary時,按照遞增順序重新排列 – user1717259

+0

標籤。當使用DataDictionary時,它會失敗並出現上述錯誤。 –

+1

在您提供的示例中解析得很好,所以我懷疑問題出在您的文件Message.txt中。 請問您可以添加一個System.out.println(messageString);這樣我們才能真正知道正在分析哪個字符串? 另外兩個備註: *您讀取文件的方式看起來很奇怪; stringBuilder.append(ls)的用途是什麼;在你的循環? *重複組453在FIX消息中出現兩次。它應該出現一次:453 = 2 | 448 = H7XNBB4851XX0REQ1F70 | 447 = N | 452 = 1 | 448 = 549300F2CCROIO4RRZ97 | 447 = N | 452 = 17 | –

回答

1

我有同樣的異常,並設法找到它的根源。

最有可能的原因是FIX消息字符串是從文件加載的,並且可能在字符串末尾有\n\r\n

然後....解析'預告片'時,最後的字符因爲沒有找到=這個事實而失敗。

Equal sign not found in field

嘗試: public static final String NEW_LINE = System.getProperty("line.separator");

  1. 刪除所有行分隔符: String msgText= loadedText.replace(NEW_LINE, "");
  2. 改變分隔符SOH(如果需要) msgText = msgText.replace(';', '\001');
  3. 然後使用的QuickFix fromString: message.fromString(msgText, dataDictionary, false);