690 likes | 818 Vues
This presentation by Paul Donohue, Technical Architect at JP Morgan, covers the evolution of bond trading in England through the AutoTrade System, a B2B bond trading solution developed to streamline communication, reduce data entry, and minimize delays. We delve into the integration of XML messaging within PowerBuilder, and how the system efficiently processes trades with remarkable speed and volume. Attendees will gain insights into XML basics, PowerBuilder capabilities, and the architectural components of the AutoTrade System, along with a summary of its success and Q&A.
E N D
ID 352An XML/PowerBuilder Messaging System • Paul Donohue • Technical Architect • JP Morgan (London) • techwave@pauldonohue.com
Overview Topics we will cover • The AutoTrade System • Overview of XML • PowerBuilder and XML • PowerBuilder and NT Services • Summary • Questions
The AutoTrade System Bond trading in England was old fashioned • Deals were sent by phone or fax • Systems did not communicate • Data was entered many times • Delays were common
The AutoTrade System Something had to be done A multi-bank working group investigated possible solutions and chose IssueLink from a vendor called CapitalNET. JP Morgan developed the AutoTrade suite of programs to interface with IssueLink.
The AutoTrade System IssueLink is a B2B bond trading system • Browser based • Automates workflow • Interfaces with back office systems • XML messaging
The AutoTrade System The participants Dealers JP Morgan IssueLink Clearing Systems Other Banks
The AutoTrade System The technology Browser or In-house AutoTrade (PB) HTTP or XML XML IssueLink (C++) HTTP or XML CNTrade (C++) Browser or In-house XML
The AutoTrade System There are four AutoTrade components • All developed with PowerBuilder • AutoTrade Server • AutoTrade Console • AutoTrade Administrator • AutoTrade Support
The AutoTrade System What is AutoTrade Server? • An NT Service • Receives XML messages • Parses XML messages • Processes XML messages • Sends XML messages
The AutoTrade System A success story • 6 weeks development • Runs 24 x 7 • Processed $20,000,000,000 USD in 9 months • Quickest trade was 1 minute 8 seconds • 25% of trades in less than 15 minutes
Overview of XML What is XML? • XML = Extensible Markup Language • Uses tags like in HTML • A format for describing structured data • Describes data structure and content • Separates data from its presentation
Overview of XML Why use XML? • Industry standard • Platform & vendor independent • Self describing • Flexible • Caters for nested & repeating data
Overview of XML An example <?xml version="1.0"?> <!--Example XML file--> <presentation code="ID352"> <title>A PB / XML Messaging System</title> <presenter>Paul Donohue</presenter> <audience>PowerBuilder Developers</audience> <time>13:30</time> <date>2001-08-13</date> </presentation>
Overview of XML Parts of an XML document • XML Declaration <?xml version="1.0"?> <!DOCTYPE presentation SYSTEM “DEMO.DTD"> <!--Example XML file--> <presentation code="ID352" > <title>A PB / XML Messaging System</title> <presenter>Paul Donohue</presenter> <audience>PowerBuilder Developers</audience> <time>13:30</time> <date>2001-08-13</date> </presentation> • Prolog • Elements • Attributes • Comments • Other Parts
Overview of XML Valid and well formed • Document Type Definitions (DTDs) define rules about XML data • DTDs are optional • Well formed XML follows the basic rules of XML • Valid XML follows the rules of the DTD • Get your DTD correct before you code
Overview of XML SAX vs DOM • Two XML interfaces • DOM = Document Object Model • SAX = Simple API for XML • AutoTrade uses DOM
Overview of XML Demonstration
PowerBuilder and XML Why use PowerBuilder? • Why not? • PB can access OLE objects • PB is good at data manipulation • PB is good at database access
PowerBuilder and XML The Microsoft Redistributable XML Parser • There are many XML parsers • Internet Explorer includes a parser • An OLE object • Can be distributed royalty free • Current version is 3 • Easy to use
PowerBuilder and XML How to parse an XML file • Connect to the parser • Load the XML file • Walk the tree • Process the results • Disconnect
PowerBuilder and XML Parsing XML - Connecting • Declare an OLE object variable oleobject iole_xml • Connect to the XML parser iole_xml .ConnectToNewObject("Microsoft.XMLDOM") • Set parser attributes iole_xml.async = FALSE iole_xml.validateOnParse = TRUE iole_xml.preserveWhiteSpace = FALSE
PowerBuilder and XML Parsing XML - Loading • Load the XML file iole_xml.load(filename) • Any errors will be in the parseerror property iole_xml.parseerror.errorCode iole_xml.parseerror.reason iole_xml.parseerror.filepos iole_xml.parseerror.line iole_xml.parseerror.linepos iole_xml.parseerror.srcText
PowerBuilder and XML Parsing XML - Walking • Find the root element lole_root = iole_xml.documentElement • Use a recursive function to walk the tree • Arguments for the function are; • The node to process (start with the root) • This node’s level (start with 1) • A “stack” to hold node details
PowerBuilder and XML Parsing XML - Walking (in circles) • Find the node’s name, type and value ls_node_name = aole_node.nodename ls_node_type = aole_node.nodetypestring ls_node_value = String(aole_node.nodevalue) • Add this node’s details to the “stack” ll_max_nodes = UpperBound(ai_level) + 1 ai_xml_node_level[ll_max_nodes]= ai_node_level as_xml_node_name[ll_max_nodes] = ls_node_name as_xml_node_type[ll_max_nodes] = ls_node_type as_xml_node_value[ll_max_nodes = ls_node_value
PowerBuilder and XML Parsing XML - Walking (in circles) • Process this node’s attributes ll_max_nodes = 0 lole_node_list = aole_node.attributes IF IsValid(lole_node_list) THEN ll_max_nodes = lole_node_list.length END IF FOR ll_idx = 0 TO ll_max_nodes – 1 lole_node = lole_node_list.Item(ll_idx) of_process_node (ai_level + 1, lole_node, stack) NEXT
PowerBuilder and XML Parsing XML - Walking (in circles) • Repeat the recursion for the child elements lole_node_list = aole_node.childNodes • There is a hasChildNodes property lb_any_children = aole_node.hasChildNodes • But there is no hasAttributeNodes property
PowerBuilder and XML Parsing XML - Processing • After parsing the XML data can be processed • Examples; • Update the database • Call a business rule object • Write to a file • Send an email
PowerBuilder and XML Parsing XML - Disconnecting • Disconnect from the XML parser iole_xml.DisConnectObject() • Destroy the OLE object variable DESTROY iole_xml
PowerBuilder and XML The XML DOM tree Presentation Code (ID352) #text (ID352) #comment (Example XML file) Title (NULL) #text (A PB/XML Messaging System) Presenter (NULL) #text (Paul Donohue)
PowerBuilder and XML Handy hints • Record macros • Generating XML files
PowerBuilder and XML Demonstration
PowerBuilder and NT Services Why use PowerBuilder? • Why not? • PB can generate an EXE • PB is fairly reliable
PowerBuilder and NT Services How to write an NT service • Create a timer object • Use the NT event log • Run the EXE as a service
PowerBuilder and NT Services Creating the timer object • Standard class inherited from timing • Add a function to initialise the service • Add a function to finalise the service • Add code to the timer event
PowerBuilder and NT Services The initialise function • Open an invisible window Open (w_service) ll_app_handle = Handle(xml_service) IF ll_app_handle = 0 THEN w_service.Visible = True END IF • Record the start in the NT event log • Start the timer running This.Start(5)
PowerBuilder and NT Services The finalise function • Perform any housekeeping • Record the stop in the NT event log
PowerBuilder and NT Services The timer event • Stop the timer This.Stop() • Perform one cycle of work This.of_process_a_cycle() • Force garbage collection GarbageCollect() • Restart the timer This.Start(5)
PowerBuilder and NT Services A cycle of work • A discrete unit of work • Should be stateless • For an XML messaging service this might be; • Check for incoming XML files • Parse the XML files • Process the XML • Generate any outgoing XML files
PowerBuilder and NT Services A cycle of work • Services can not access network drives • Services can not interact with the user • Connect to database each cycle? • Maintain connection between cycles?
PowerBuilder and NT Services The NT event log • Use Win32 API calls to write to the event log • RegisterEventSource() – Retrieves a handle to the event log • ReportEvent() – Writes an entry to the event log • DeregisterEventSource() – Closes the event log handle
PowerBuilder and NT Services The nasty event log warning • All messages are prefixed by a nasty warning • This is because we don’t have a message file
PowerBuilder and NT Services Message files • The wording of events is stored in message files • Each has a unique ID • Messages can have placeholders • Message files are compiled into DLLs • PowerBuilder can’t create message file DLLs • Make a generic message file
PowerBuilder and NT Services Using the timer object • Declare a global variable n_cst_service gnv_service • Instantiate the object in Application Open event gnv_service = CREATE n_cst_service gnv_service.of_initialise() • Destroy the object in Application Close event gnv_service.of_finalise() DESTROY gnv_service
PowerBuilder and NT Services Running as a service • Compile your application into an EXE. • Windows NT4 Resource Kit utilities • SRVANY run any EXE as an NT service • SRVINSTW install an NT service
PowerBuilder and NT Services Using SRVINSTW – Step 1 • An easy to follow wizard interface
PowerBuilder and NT Services Using SRVINSTW – Step 2 • Select local machine