690 likes | 806 Views
ID 352 An XML / Power B uilder 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.
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