[Quickfix-developers] RE: Intermittent disconnect problem
Brought to you by:
orenmnero
From: Bishop, B. <Bar...@gs...> - 2004-12-01 11:08:34
|
Hi Oren, As promised I'm reporting back on my progress. So far, I have not managed to get a newer version of quickfix in to production for the following reasons: I could not get version 1.9.4 to build at all. I've never managed to build any version of quickfix on solaris using the configure & make files and have always resorted to building everything in to one enormous '.so'. However this time there were just too many problems. I had built version 1.9.2 a couple of weeks ago, so I tested with this under some very stressful loads. After forcing quickfix to disconnect it was able to reconnect and re-synchronise much better than the version we have in production (1.4.0). I had it processing QuoteRequest/Quote and NewOrderSingle/ExecutionReport messages almost continously for three hours while I periodically broke the pipe between us and our client's QA system. Sadly, I overlooked the sending of QuoteAcknowledgement (FIX 4.2) messages and the first time I tried this it went very wrong. The message quickfix sent was malformed with a group of fields repeated approximately six times and an incorrect body length. Needless to say that the client's system rejected this. This morning I realised that 1.9.4 isn't an offical release yet. Is this correct? I will have one more try with version 1.9.3. If I can get this to build then I can test out the QuoteAcknowledgement message. A few questions: 1) The release notes for 1.9.3 mention some fixes in handling repeating groups. Do you think these fixes might help my problem? 2) Does anyone use quickfix on solaris and if so how do they build it? Again, thanks for your help. Some related information is appended to the bottom of this mail. barry ######################################################## The java code that packs a QuoteAcknowledgement message: QuoteAcknowledgement message = new QuoteAcknowledgement(); message.getHeader().setField( new SenderCompID( reject.senderCompId) ); message.getHeader().setField( new TargetCompID( reject.targetCompId) ); message.getHeader().setField( new DeliverToCompID( reject.deliverToCompId) ); message.getHeader().setField( new DeliverToSubID( reject.deliverToSubId) ); message.getHeader().setField( new DeliverToLocationID( reject.deliverToLocationId) ); message.set( new QuoteReqID( reject.quoteReqId ) ); message.set( new QuoteID( reject.quoteId ) ); message.set( new QuoteAckStatus( reject.quoteAckStatus ) ); if ( reject.quoteRejectReason != null ) message.set( new QuoteRejectReason( reject.quoteRejectReason.intValue() ) ); if ( reject.text != null ) message.set( new Text( reject.text ) ); QuoteAcknowledgement.NoQuoteSets.NoQuoteEntries quoteEntries = new QuoteAcknowledgement.NoQuoteSets.NoQuoteEntries(); quoteEntries.set( new IDSource( reject.idSource ) ); quoteEntries.set( new SecurityID( reject.securityId ) ); quoteEntries.set( new Symbol( reject.symbol ) ); quoteEntries.set( new QuoteEntryID() ); // quoteEntries.set( new QuoteEntryID( "1" ) ); ## Tried this also if ( reject.putOrCall != null ) quoteEntries.set( new PutOrCall( reject.putOrCall.intValue() ) ); if ( reject.strikePrice != null ) quoteEntries.set( new StrikePrice( reject.strikePrice.doubleValue() ) ); if ( reject.optAttribute != null ) quoteEntries.set( new OptAttribute( reject.optAttribute.charValue() ) ); if ( reject.maturityMonthYear != null ) quoteEntries.set( new MaturityMonthYear( reject.maturityMonthYear ) ); if ( reject.maturityDay != null ) quoteEntries.set( new MaturityDay( reject.maturityDay ) ); if ( reject.securityDescription != null ) quoteEntries.set( new SecurityDesc( reject.securityDescription ) ); if ( reject.contractMultiplier != null ) quoteEntries.set( new ContractMultiplier( reject.contractMultiplier.doubleValue() ) ); if ( reject.securityType != null ) quoteEntries.set( new SecurityType( reject.securityType ) ); QuoteAcknowledgement.NoQuoteSets quoteSets = new QuoteAcknowledgement.NoQuoteSets(); quoteSets.set( new QuoteSetID() ); // quoteSets.set( new QuoteSetID( "1" ) ); ## Tried this also quoteSets.set( new UnderlyingSymbol( "und" ) ); // Dummy entry, just to make the message work. quoteSets.addGroup( quoteEntries ); message.addGroup( quoteSets ); #################################################### An example of a bad QuoteAcknowledgement message: Message=quickfix.fix42.QuoteAcknowledgement:8=FIX.4.2|9=323|35=b|34=17942|49 =XXXXXXX|52=20041130-16:45:03.556|56=XXXXXX| 128=9999|129=WTSTSTWTSTSTG000|145=2381-QITSCG15|58=Unknown symbol.|117=3WLR1LWS6|131=200411300129|296=1|302=| 311=und|295=1|299=| 55=XXXXXXX|48=GS9709|22=108|167=OPT|200=200506|205=20|201=1|202=30|206=L|231 =0.1|107=XXXXXXXXXX-30-C-0.1|295=1|299=| 55=XXXXXXX|48=GS9709|22=108|167=OPT|200=200506|205=20|201=1|202=30|206=L|231 =0.1|107=XXXXXXXXXX-30-C-0.1|295=1|299=| 55=XXXXXXX|48=GS9709|22=108|167=OPT|200=200506|205=20|201=1|202=30|206=L|231 =0.1|107=XXXXXXXXXX-30-C-0.1|296=1|302=| 311=und|295=1|299=| 55=XXXXXXX|48=GS9709|22=108|167=OPT|200=200506|205=20|201=1|202=30|206=L|231 =0.1|107=XXXXXXXXXX-30-C-0.1|295=1|299=| 55=XXXXXXX|48=GS9709|22=108|167=OPT|200=200506|205=20|201=1|202=30|206=L|231 =0.1|107=XXXXXXXXXX-30-C-0.1|295=1|299=| 55=XXXXXXX|48=GS9709|22=108|167=OPT|200=200506|205=20|201=1|202=30|206=L|231 =0.1|107=XXXXXXXXXX-30-C-0.1|297=5|300=1|10=245 #################################################### My FIX42.xml definition of QuoteAcknowledgement (not sure is this affects outgoing messages) <message name="QuoteAcknowledgement" msgtype="b" msgcat="app"> <field name="QuoteReqID" required="N"/> <field name="QuoteID" required="Y"/> <field name="QuoteAckStatus" required="Y"/> <field name="QuoteRejectReason" required="Y"/> <field name="QuoteResponseLevel" required="N"/> <field name="TradingSessionID" required="N"/> <field name="Text" required="N"/> <!-- <group name="NoQuoteSets" required="N"> --> ## I have tried with both a field or a group here <field name="NoQuoteSets" required="N"/> <field name="QuoteSetID" required="N"/> <field name="UnderlyingSymbol" required="N"/> <field name="UnderlyingSymbolSfx" required="N"/> <field name="UnderlyingSecurityID" required="N"/> <field name="UnderlyingIDSource" required="N"/> <field name="UnderlyingSecurityType" required="N"/> <field name="UnderlyingMaturityMonthYear" required="N"/> <field name="UnderlyingMaturityDay" required="N"/> <field name="UnderlyingPutOrCall" required="N"/> <field name="UnderlyingStrikePrice" required="N"/> <field name="UnderlyingOptAttribute" required="N"/> <field name="UnderlyingContractMultiplier" required="N"/> <field name="UnderlyingCouponRate" required="N"/> <field name="UnderlyingSecurityExchange" required="N"/> <field name="UnderlyingIssuer" required="N"/> <field name="EncodedUnderlyingIssuerLen" required="N"/> <field name="EncodedUnderlyingIssuer" required="N"/> <field name="UnderlyingSecurityDesc" required="N"/> <field name="EncodedUnderlyingSecurityDescLen" required="N"/> <field name="EncodedUnderlyingSecurityDesc" required="N"/> <field name="TotQuoteEntries" required="N"/> <!-- <group name="NoQuoteEntries" required="N"> --> ## I have tried with both here also <field name="NoQuoteEntries" required="N"/> <field name="QuoteEntryID" required="N"/> <field name="Symbol" required="N"/> <field name="SymbolSfx" required="N"/> <field name="SecurityID" required="N"/> <field name="IDSource" required="N"/> <field name="SecurityType" required="N"/> <field name="MaturityMonthYear" required="N"/> <field name="MaturityDay" required="N"/> <field name="PutOrCall" required="N"/> <field name="StrikePrice" required="N"/> <field name="OptAttribute" required="N"/> <field name="ContractMultiplier" required="N"/> <field name="CouponRate" required="N"/> <field name="SecurityExchange" required="N"/> <field name="Issuer" required="N"/> <field name="EncodedIssuerLen" required="N"/> <field name="EncodedIssuer" required="N"/> <field name="SecurityDesc" required="N"/> <field name="EncodedSecurityDescLen" required="N"/> <field name="EncodedSecurityDesc" required="N"/> <field name="QuoteEntryRejectReason" required="N"/> <!--</group>--> <!--</group>--> </message> -----Original Message----- From: Bishop, Barry Sent: Tuesday, November 30, 2004 8:11 AM To: 'or...@qu...' Cc: 'qui...@li...' Subject: RE: [Quickfix-developers] Intermittent disconnect problem QuickFIX Documentation: http://www.quickfixengine.org/quickfix/doc/html/index.html QuickFIX FAQ: http://www.quickfixengine.org/wikifix/index.php?QuickFixFAQ QuickFIX Support: http://www.quickfixengine.org/services.html Hello Oren, Thanks for the reply. Sounds to me like I should try version 1.9.2 or later in our production environment. I have been unable to reproduce the mysterious disconnect in our QA system to the same client, but this is not surprising as it is so infrequent. I have been simulating it by breaking something else in the chain (which would appear as a client disconnect) so this would explain the lack of an explanation from quickfix. I will try this over the next few days and report back. Thanks again, barry -----Original Message----- From: or...@qu... [mailto:or...@qu...] Sent: Monday, November 29, 2004 7:56 PM To: Bishop, Barry Cc: 'qui...@li...' Subject: RE: [Quickfix-developers] Intermittent disconnect problem Barry, For every disconnect that QuickFIX initiates, there should be a reason provided (not with 1.4.0, but with the new releases). With 1.9.4 (available now), QuickFIX also displays a "Dropped Connection" message if the disconnect is initiated by the peer (1.9.2, does not differentiate). That should help you to verify if it is QuickFIX that is initiating the disconnect. I don't think there are any more cases where QuickFIX initiates a disconnect without providing a reason. If the couterparty drops the connection, then unless they provide information in the form of a reject or logoff text, there is little QuickFIX can do to determine the cause. The best that we can probably do is report whether the socket was dropped gracefully, and therefore intentionally, or if it was an abnormal disconnect of some sort. Is there anything significantly different about this new client? Does their logs reveal anything about the nature of the disconnect? --oren > 1) Anyone have any idea what's going on? > 2) Is there a way to increase the amount of detail in log messages, > especially those to do with disconnection events? > 3) What sort of thing would cause quickfix to disconnect without > saying why? > > Thanks in advance, > barry ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://productguide.itmanagersjournal.com/ _______________________________________________ Quickfix-developers mailing list Qui...@li... https://lists.sourceforge.net/lists/listinfo/quickfix-developers |