Thread: [Quickfix-users] Can't Crack a message created from the MessageStore
Brought to you by:
orenmnero
From: abaraff <ab...@ra...> - 2011-05-17 19:01:29
|
I'd like to reprocess all the existing messages I've previously received when starting a session. I've tried both directly calling crack() on them as well as forcing them through my fromApp callback. Either way I get UnsupportedMessageType exceptions on MessageTypes that I have onMessage methods for--it's important to note that all the code works fine when QuickFIX initially sends these messages in via the fromApp method. My onCreate method looks like this: public void onCreate(SessionID sessionID) { MessageStore ms = Session.lookupSession(sessionID).getStore(); System.Collections.ArrayList messages = new System.Collections.ArrayList(); ms.get(1, Math.Max(ms.getNextSenderMsgSeqNum() - 1, ms.getNextTargetMsgSeqNum() - 1), messages); System.Diagnostics.Debug.WriteLine(messages.Count + " found for " + sessionID.ToString()); foreach (string message in messages) { Message msg = new Message(message); MsgType type = new MsgType(); msg.getHeader().getField(type); System.Diagnostics.Debug.WriteLine(type.ToString()); System.Diagnostics.Debug.WriteLine(msg.isAdmin() + "\t" + msg.getHeader().getInt(MsgSeqNum.FIELD) + "\t" + type.ToString()); fromApp(msg, sessionID); } System.Diagnostics.Debug.WriteLine("OnCreate:" + sessionID.ToString()); } fromApp looks like this: public void fromApp(Message msg, SessionID sessionID) { System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.FFFF") + " FromApp:" + sessionID.ToString() + "\t" + msg.ToString()); try { crack(msg, sessionID); } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.ToString()); } } And I have the following cracker overrides: public override void onMessage(QuickFix42.ExecutionReport message, SessionID session) { System.Diagnostics.Debug.WriteLine("Execution Report"); } public override void onMessage(QuickFix42.OrderCancelReject message, SessionID session) { System.Diagnostics.Debug.WriteLine("Cancel Rejected"); } public override void onMessage(QuickFix42.Reject message, SessionID session) { System.Diagnostics.Debug.WriteLine("Something Rejected"); } public override void onMessage(QuickFix42.ResendRequest message, SessionID session) { System.Diagnostics.Debug.WriteLine("Resend Requested"); } public override void onMessage(QuickFix42.NewOrderSingle message, SessionID session) { System.Diagnostics.Debug.WriteLine("New Order Single"); } Here is some of the output(D is NewOrderSingle and I have an onMessageMethod for NewOrderSingle): D False 2 D 14:40:00.5585 FromApp:FIX.4.2:SCTC->DBSI 8=FIX.4.29=18035=D34=249=SCTC52=20110517-17:38:46.77656=DBSI11=SCT20110517-133846_0000018=121=138=20040=154=155=IBM58=SCT20110517-133846_0000059=060=20110517-13:38:46100=DB-SMART10=040 A first chance exception of type 'QuickFix.UnsupportedMessageType' occurred in quickfix_net_messages.dll QuickFix.UnsupportedMessageType: Exception of type 'QuickFix.UnsupportedMessageType' was thrown. at QuickFix42.MessageCracker.onMessage(Message message, SessionID session) at QuickFix42.MessageCracker.crack(Message message, SessionID sessionID) at FIXServer.FIXServerApp.fromApp(Message msg, SessionID sessionID) in C:\Dev\Abaraff\FIXServer\FIXServer\FIXServerApp.cs:line 209 D False 3 D 14:40:00.5742 FromApp:FIX.4.2:SCTC->DBSI 8=FIX.4.29=18035=D34=349=SCTC52=20110517-17:38:49.93356=DBSI11=SCT20110517-133849_0000118=121=138=20040=154=255=IBM58=SCT20110517-133849_0000159=060=20110517-13:38:49100=DB-SMART10=051 A first chance exception of type 'QuickFix.UnsupportedMessageType' occurred in quickfix_net_messages.dll QuickFix.UnsupportedMessageType: Exception of type 'QuickFix.UnsupportedMessageType' was thrown. at QuickFix42.MessageCracker.onMessage(Message message, SessionID session) at QuickFix42.MessageCracker.crack(Message message, SessionID sessionID) at FIXServer.FIXServerApp.fromApp(Message msg, SessionID sessionID) in C:\Dev\Abaraff\FIXServer\FIXServer\FIXServerApp.cs:line 209 -- View this message in context: http://old.nabble.com/Can%27t-Crack-a-message-created-from-the-MessageStore-tp31640827p31640827.html Sent from the QuickFIX - User mailing list archive at Nabble.com. |
From: abaraff <ab...@ra...> - 2011-05-18 19:59:39
|
Creating a Message using the new Message(string) constructor doesn't return an identical message to the original. It modifies and increments a number of things. Executing the following code: public void fromApp(Message msg, SessionID sessionID) { try { string message = msg.ToString(); Message nm = new Message(message); crack(msg, sessionID); try { crack(newMessage, sessionID); } catch (Exception e2) { Debug.WriteLine(e2.ToString()); Debug.WriteLine("orig: " + msg.ToXML()); Debug.WriteLine("new: " + nm.ToXML()); Debug.WriteLine("round trip failed"); } } catch (Exception e) { Debug.WriteLine(e.ToString()); } } Gives the following output: A first chance exception of type 'QuickFix.UnsupportedMessageType' occurred in quickfix_net_messages.dll orig: <message> <header> <field number="8"><![CDATA[FIX.4.2]]></field> <field number="9"><![CDATA[257]]></field> <field number="35"><![CDATA[8]]></field> <field number="34"><![CDATA[2]]></field> <field number="49"><![CDATA[SCTC]]></field> <field number="52"><![CDATA[20110518-19:39:08.402]]></field> <field number="56"><![CDATA[SCT1]]></field> </header> <body> <field number="6"><![CDATA[0.0000]]></field> <field number="11"><![CDATA[SCT20110518-153908_00000]]></field> <field number="14"><![CDATA[0]]></field> <field number="17"><![CDATA[1839597056]]></field> <field number="18"><![CDATA[1]]></field> <field number="20"><![CDATA[0]]></field> <field number="21"><![CDATA[1]]></field> <field number="31"><![CDATA[0.0000]]></field> <field number="32"><![CDATA[0]]></field> <field number="37"><![CDATA[110518-193902-3]]></field> <field number="38"><![CDATA[200]]></field> <field number="39"><![CDATA[0]]></field> <field number="40"><![CDATA[1]]></field> <field number="54"><![CDATA[1]]></field> <field number="55"><![CDATA[IBM]]></field> <field number="58"><![CDATA[SCT20110518-153908_00000]]></field> <field number="59"><![CDATA[0]]></field> <field number="60"><![CDATA[20110518-19:39:02.590]]></field> <field number="150"><![CDATA[0]]></field> <field number="151"><![CDATA[200]]></field> </body> <trailer> <field number="10"><![CDATA[058]]></field> </trailer> </message> new: <message> <header> <field number="8"><![CDATA[FIX.4.2]]></field> <field number="9"><![CDATA[258]]></field> <field number="35"><![CDATA[8]]></field> <field number="34"><![CDATA[71]]></field> <field number="49"><![CDATA[DBSI]]></field> <field number="52"><![CDATA[20110518-19:39:02.591]]></field> <field number="56"><![CDATA[SCTC]]></field> </header> <body> <field number="6"><![CDATA[0.0000]]></field> <field number="11"><![CDATA[SCT20110518-153908_00000]]></field> <field number="14"><![CDATA[0]]></field> <field number="17"><![CDATA[1839597056]]></field> <field number="18"><![CDATA[1]]></field> <field number="20"><![CDATA[0]]></field> <field number="21"><![CDATA[1]]></field> <field number="31"><![CDATA[0.0000]]></field> <field number="32"><![CDATA[0]]></field> <field number="37"><![CDATA[110518-193902-3]]></field> <field number="38"><![CDATA[200]]></field> <field number="39"><![CDATA[0]]></field> <field number="40"><![CDATA[1]]></field> <field number="54"><![CDATA[1]]></field> <field number="55"><![CDATA[IBM]]></field> <field number="58"><![CDATA[SCT20110518-153908_00000]]></field> <field number="59"><![CDATA[0]]></field> <field number="60"><![CDATA[20110518-19:39:02.590]]></field> <field number="150"><![CDATA[0]]></field> <field number="151"><![CDATA[200]]></field> </body> <trailer> <field number="10"><![CDATA[123]]></field> </trailer> </message> round trip failed Many of the header values have been changed: Field 9 from 257 to 258. Field 34 from 2 to 71. Field 49from "SCTC" to "DBSI" Field 52 from 20110518-19:39:08.402 to CDATA[20110518-19:39:02.591 Is this intended behavior? If so then why? It seems exceptionally counter intuitive that an object constructor should selectively modify data supplied to its constructor. Thanks, Anthony Not that it matters, but I'm attempting to persist the messages then push them back through my application to restore state since there is no inbuilt mechanism within QuickFIX. -- View this message in context: http://old.nabble.com/.Net-Message-can%27t-make-round-trip-from-Message-to-string-and-back-to-Message-tp31640827p31650349.html Sent from the QuickFIX - User mailing list archive at Nabble.com. |