Title: ID 352 An XML / PowerBuilder Messaging System
1ID 352An XML / PowerBuilder Messaging System
- Paul Donohue
- Technical Architect
- JP Morgan (London)
- techwave_at_pauldonohue.com
2Overview
Topics we will cover
- The AutoTrade System
- Overview of XML
- PowerBuilder and XML
- PowerBuilder and NT Services
- Summary
- Questions
3The AutoTrade System
4The 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
5The 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.
6The AutoTrade System
IssueLink is a B2B bond trading system
- Browser based
- Automates workflow
- Interfaces with back office systems
- XML messaging
7The AutoTrade System
The participants
JP Morgan
Dealers
IssueLink
Clearing Systems
Other Banks
8The AutoTrade System
The technology
AutoTrade (PB)
Browser or In-house
HTTP or XML
XML
IssueLink (C)
HTTP or XML
CNTrade (C)
Browser or In-house
XML
9The AutoTrade System
There are four AutoTrade components
- All developed with PowerBuilder
- AutoTrade Server
- AutoTrade Console
- AutoTrade Administrator
- AutoTrade Support
10The AutoTrade System
What is AutoTrade Server?
- An NT Service
- Receives XML messages
- Parses XML messages
- Processes XML messages
- Sends XML messages
11The 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
12Overview of XML
13Overview 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
14Overview of XML
Why use XML?
- Industry standard
- Platform vendor independent
- Self describing
- Flexible
- Caters for nested repeating data
15Overview of XML
An example
- lt?xml version"1.0"?gt
- lt!--Example XML file--gt
- ltpresentation code"ID352"gt
- lttitlegtA PB / XML Messaging Systemlt/titlegt
- ltpresentergtPaul Donohuelt/presentergt
- ltaudiencegtPowerBuilder Developerslt/audiencegt
- lttimegt1330lt/timegt
- ltdategt2001-08-13lt/dategt
- lt/presentationgt
16Overview of XML
Parts of an XML document
lt?xml version"1.0"?gt lt!DOCTYPE presentation
SYSTEM DEMO.DTD"gt lt!--Example XML
file--gt ltpresentation code"ID352" gt lttitlegtA PB
/ XML Messaging Systemlt/titlegt ltpresentergtPaul
Donohuelt/presentergt ltaudiencegtPowerBuilder
Developerslt/audiencegt lttimegt1330lt/timegt ltdategt200
1-08-13lt/dategt lt/presentationgt
17Overview 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
18Overview of XML
SAX vs DOM
- Two XML interfaces
- DOM Document Object Model
- SAX Simple API for XML
- AutoTrade uses DOM
19Overview of XML
Demonstration
20PowerBuilder and XML
21PowerBuilder and XML
Why use PowerBuilder?
- Why not?
- PB can access OLE objects
- PB is good at data manipulation
- PB is good at database access
22PowerBuilder 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
23PowerBuilder and XML
How to parse an XML file
- Connect to the parser
- Load the XML file
- Walk the tree
- Process the results
- Disconnect
24PowerBuilder 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
25PowerBuilder 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.li
ne iole_xml.parseerror.linepos iole_xml.parseerror
.srcText
26PowerBuilder 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 nodes level (start with 1)
- A stack to hold node details
27PowerBuilder and XML
Parsing XML - Walking (in circles)
- Find the nodes 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 nodes details to the stack
ll_max_nodes UpperBound(ai_level) 1
ai_xml_node_levelll_max_nodes ai_node_level
as_xml_node_namell_max_nodes ls_node_name
as_xml_node_typell_max_nodes ls_node_type
as_xml_node_valuell_max_nodes ls_node_value
28PowerBuilder and XML
Parsing XML - Walking (in circles)
- Process this nodes 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
29PowerBuilder 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
30PowerBuilder 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
31PowerBuilder and XML
Parsing XML - Disconnecting
- Disconnect from the XML parser
iole_xml.DisConnectObject() - Destroy the OLE object variable
DESTROY iole_xml
32PowerBuilder 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)
33PowerBuilder and XML
Handy hints
- Record macros
- Generating XML files
34PowerBuilder and XML
Demonstration
35PowerBuilder and NT Services
36PowerBuilder and NT Services
Why use PowerBuilder?
- Why not?
- PB can generate an EXE
- PB is fairly reliable
37PowerBuilder and NT Services
How to write an NT service
- Create a timer object
- Use the NT event log
- Run the EXE as a service
38PowerBuilder 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
39PowerBuilder 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)
40PowerBuilder and NT Services
The finalise function
- Perform any housekeeping
- Record the stop in the NT event log
41PowerBuilder 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)
42PowerBuilder 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
43PowerBuilder 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?
44PowerBuilder 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
45PowerBuilder and NT Services
The nasty event log warning
- All messages are prefixed by a nasty warning
- This is because we dont have a message file
46PowerBuilder 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 cant create message file DLLs
- Make a generic message file
47PowerBuilder 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
48PowerBuilder 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
49PowerBuilder and NT Services
Using SRVINSTW Step 1
- An easy to follow wizard interface
50PowerBuilder and NT Services
Using SRVINSTW Step 2
51PowerBuilder and NT Services
Using SRVINSTW Step 3
52PowerBuilder and NT Services
Using SRVINSTW Step 4
- The executable is SRVANY.EXE
- Not your Power Builder executable
53PowerBuilder and NT Services
Using SRVINSTW Step 5
- The service should be its own process
54PowerBuilder and NT Services
Using SRVINSTW Step 6
- The system account does not require a user id or
password - SRVANY needs to interact with the desktop
55PowerBuilder and NT Services
Using SRVINSTW Step 7
- Set the startup option to automatic
- NT will start the service when the machine boots
- With no need for a user to log on
56PowerBuilder and NT Services
Using SRVINSTW Step 8
- Press Finish to create the service
57PowerBuilder and NT Services
Configuring SRVANY
- SRVINSTW will create an registry entry for your
service under the key
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services - Add two new keys called Parameters and Enum
under your service
58PowerBuilder and NT Services
Configuring SRVANY
- Add three string values under the Parameters
key - Application Your services path EXE
- AppDirectory Your services working directory
- AppParameters Any command line parameters
- Do not add any values under the Enum key
- These will be added when the service is first run
59PowerBuilder and NT Services
Controlling your service
- SRVANY uses TerminateProcess() to stop your EXE
- No application or window Close events
- Use a registry entry to request a shut down
- Check the registry each cycle
- Close the invisible window to stop your EXE
60PowerBuilder and NT Services
Handy hints
- Make your app bullet proof
- Test for memory leaks
- Reconnect lost database connections
- Write an administration utility
61PowerBuilder and NT Services
Demonstration
62Summary
63Summary
What have we learnt?
- A little about XML
- How XML can be used in a B2B system
- How to process XML with PowerBuilder
- How to write an NT Service with PowerBuilder
64Summary
Recommended reading
Title Professional XML Author Mark Birbeck et
al Publisher Wrox Press Inc ISBN 1861003110
65Summary
Recommended reading
Title Professional NT Services Author Kevin
Miller Publisher Wrox Press Inc ISBN 1861001304
66Summary
XML resources on the internet
- http//www.xml.com
- http//www.xml.org
- http//www.w3.org/xml
- http//msdn.microsoft.com/xml/default.asp
67Summary
Free downloads from Microsoft
- The Microsoft Parser other tools
http//msdn.microsoft.com/downloads
- XML Notepad http//msdn.microsoft.com/xml/notepad/
intro.asp - Windows NT4 Resource Kit utilities
ftp//ftp.microsoft.com /bussys/winnt/winnt-public
/reskit/nt40/i386/
68Questions
- If you have any questions about this presentation
or you would like a copy of the PB objects please
email me or visit my web site. - Email techwave_at_pauldonohue.com
- Web http//www.pauldonohue.com/techwave
69About The Author
Paul Donohue
- Paul has 15 years experience as a solution
provider. - He has worked with PowerBuilder since version 2
and is a Certified PowerBuilder Developer. - He now concentrates on XML, Java, EJB, JSP and
other distributed technologies.