1 Introduction
Upcoming SlideShare
Loading in...5
×
 

1 Introduction

on

  • 1,487 views

 

Statistics

Views

Total Views
1,487
Views on SlideShare
1,487
Embed Views
0

Actions

Likes
0
Downloads
12
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft Word

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

1 Introduction 1 Introduction Document Transcript

  • Michael Wong 151220 University of Portsmouth Computing & Mathematics Programme Area Final year project undertaken in partial fulfilment of the requirements for the BSc (Honours) Degree in Computer Science (IBM Integrated) An Investigation of the performance of Web Services for the Wimbledon Information System by Michael Wong (151220) Supervisor: Dr Mark Baker Project unit: CP.WEPT2 2003 Abstract This project investigates the performance of Web services for real time applications. In order to assess the suitability of Web services, benchmarking tests were devised and round trip times recorded and analysed. An existing web based application in the form the Wimbledon Java Scoreboard was then analysed and test cases pertinent to it devised. Round trip times were then recorded, analysed and compared with the benchmarking test cases. Findings suggested that Web services in their current form perform sufficiently well for trial implementations of real time applications. However, as the application of Web services for real time applications is still new and in a relative phase of infancy many issues remain to be explored, including further work in performance, security and Quality of Service. 1
  • Michael Wong 151220 Acknowledgements This project could not have been possible without the following people who I thank: • Mark Baker of the University of Portsmouth for his supervision and guidance in this project • Alex Phillips for his assistance in many areas particularly Wimbledon related work with Wimbledon Information System and the Java Scoreboard • Anna Withrington for her understanding about time • Andy Burns and Ian Hughes for suggesting a project in Web Services • My parents and my brother for their constant support and encouragement 2
  • Michael Wong 151220 1 INTRODUCTION.................................................................................................................5 1.1 WIMBLEDON – THE CHAMPIONSHIPS...............................................................................................6 1.2 IBM - OFFICIAL INFORMATION PROVIDER.........................................................................................7 1.3 WEB SERVICES.....................................................................................................................8 1.4 THE PROBLEM.....................................................................................................................10 1.5 AIMS AND OBJECTIVES...........................................................................................................11 1.6 CONSTRAINTS.....................................................................................................................12 1.7 PROJECT OVERVIEW...............................................................................................................13 2 REVIEW...........................................................................................................................14 2.1 WEB SERVICES...................................................................................................................15 2.1.1 ARCHITECTURE..............................................................................................................16 2.1.2 SOAP, WSDL AND UDDI..............................................................................................19 2.2 WEB SERVICE DEVELOPER KITS - HOSTING PLATFORMS...........................................................................27 2.3 QUALITY OF SERVICE – PERFORMANCE AND TESTING............................................................................30 2.4 JAVA SCOREBOARD ARCHITECTURE................................................................................................33 2.5 JAVA SCOREBOARD INTERACTION ANALYSIS......................................................................................36 2.6 BENCHMARKING WEB SERVICES..................................................................................................39 3 DESIGN............................................................................................................................41 3.1 TIME STAMPING - CODE INSERTION..............................................................................................42 3.2 DETAILED ANALYSIS OF TEST CASE SCENARIOS..................................................................................44 3.3 BENCHMARKING TEST CASES.....................................................................................................46 3.4 DETERMINING PERIODICITY OF JSB APPLICATION DATA...........................................................................47 3.5 IMPLEMENTING LOGGING AND TIMESTAMPING.....................................................................................48 3.5 TIMING ISSUES...................................................................................................................49 3.6 DEFINING TEST DATA............................................................................................................50 3.7 TEST ENVIRONMENT..............................................................................................................51 3.8 TESTING PROCEDURES............................................................................................................52 4 IMPLEMENTATION...........................................................................................................53 4.1 INTRODUCTION....................................................................................................................54 4.2 JSB INTERACTION TEST CASES..................................................................................................55 4.2.1 TEST CASE 1: ONE WAY - “A SINGLE ONE WAY MESSAGE REQUEST” ....................................................55 4.2.2 TEST CASE 2: UPDATE BY POLLING - “A REQUEST-RESPONSE COMMUNICATION, WHERE THE RESPONSE CONTAINS A PAYLOAD OF APPLICATION DATA”..............................................................................................................56 4.2.3 TEST CASE 3: CHECK/POLL AND RESPONSE/UPDATE - “REPEATED REQUEST-RESPONSE COMMUNICATION, WHERE MOST RESPONSES ARE OF A SMALL PAYLOAD AND FEWER RESPONSES CONTAINING A PAYLOAD OF APPLICATION DATA”.......................57 4.3 BENCHMARKING TEST CASES.....................................................................................................58 4.3.1 RETURNING PRIMITIVES - SIMPLE RPC....................................................................................58 4.3.2 RETURNING MULTIPLE PRIMITIVES – COMPLEX RPC.......................................................................59 4.3 DEPLOYING TEST CASES..........................................................................................................60 4.3.1 BATCH SCRIPTS AND CLASS PATHS ........................................................................................60 4.3.2 CONNECTING THE REQUESTOR TO THE PROVIDER.............................................................................60 5 ANALYSIS OF RESULTS AND EVALUATION.......................................................................62 5.1 BENCHMARKING RESULTS.........................................................................................................63 5.1.1 SIMPLE RPC PRIMITIVE DATA TYPE RESULTS.............................................................................63 5.1.2 COMPLEX RPC PRIMITIVE PAYLOAD........................................................................................67 5.2 JSB INTERACTION RESULTS......................................................................................................70 5.3 ASSESSING METHODOLOGY.......................................................................................................73 6 SUMMARY, CONCLUSIONS AND FUTURE...........................................................................76 6.1 SUCCESS OF PROJECT.............................................................................................................76 6.2 FUTURE WORK....................................................................................................................78 6.3 FINAL REMARKS..................................................................................................................79 REFERENCES.......................................................................................................................80 INTRODUCTION.........................................................................................................................80 REVIEW................................................................................................................................82 WEB SERVICES.....................................................................................................................82 WEB SERVICES DEVELOPER KITS – HOSTING PLATFORMS...............................................................................84 QUALITY OF SERVICE – PERFORMANCE AND TUNING................................................................................85 JAVA SCOREBOARD ARCHITECTURE..................................................................................................86 JAVA SCOREBOARD INTERACTION ANALYSIS ........................................................................................87 BENCHMARKING WEB SERVICES.....................................................................................................88 DESIGN................................................................................................................................89 IMPLEMENTATION.......................................................................................................................90 ANALYSIS OF RESULTS AND EVALUATION...............................................................................................91 LIST OF FIGURES................................................................................................................92 APPENDICES.......................................................................................................................93 APPENDIX A: REQUIREMENTS..........................................................................................................94 APPENDIX B: WIMBLIVE DATABASE - CURRENT VIEW DESCRIBE.....................................................................95 APPENDIX C: BACKGROUND SERVICES (RUNNING DURING TESTING)...................................................................96 APPENDIX D: COMMUNICATION - SOFTROS RE: NETWORK TIME SYSTEM LATENCY..................................................97 APPENDIX E: ERROR LOG FOR NO CHARACTER MAPPING IN AXIS....................................................................98 APPENDIX F: SAMPLE BATCH SCRIPT FOR RUNNING TEST CASES......................................................................99 3 View slide
  • Michael Wong 151220 APPENDIX G: AXIS FAULT - CONNECTION REFUSED STACK TRACE.................................................................100 APPENDIX H: SOURCE FILES........................................................................................................101 RETURN LONG - SIMPLE RPC....................................................................................................101 RETURN MULTIPLE BYTES – COMPLEX RPC......................................................................................110 ONE WAY – SIMPLE RPC........................................................................................................123 COLLECT AND UPDATE (HIGH PAYLOAD) - COMPLEXRPC4......................................................................130 APPENDIX I: COMPLEX RPC RESULTS...............................................................................................159 APPENDIX J: SIMPLE RPC RESULTS................................................................................................162 APPENDIX K : JSB INTERACTION TEST RESULTS.....................................................................................166 4 View slide
  • Michael Wong 151220 1 Introduction The first section of the project report outlines the background and the problem to be solved. 5
  • Michael Wong 151220 1.1 Wimbledon – The Championships Every June, The All England Lawn Tennis and Croquet Club is host to The Lawn Tennis Championships. The Championships first started in 1877 when the only event was the Gentlemen’s singles and was won by Spencer Gore. In 1884 Ladies’ singles was added to the list of events and by the turn of the century The Championships had become an international tournament. The Championships has continued to evolve to the status of a professional Grand Slam tournament and now attracts players from over 60 countries who compete for titles in singles, doubles, junior, senior and wheelchair events [1]. The Championships is a very popular event and over the 2 weeks attracts over 500,000 visiting spectators as well as millions of tennis fans, who track the events through TV, the Web, Radio and mobile devices. The demand for information regarding Wimbledon and the events which unroll there is high. IBM is the official information provider. [2] 6
  • Michael Wong 151220 1.2 IBM - Official Information Provider IBM is the official information provider for The Championships – Wimbledon. IBM’s offerings include the Commentator System – providing real time detailed statistics to commentators, graphics and statistics for TV broadcasters, an Intranet system and an Internet presence. Each of the systems possesses a different focus tailored to the intended end users. For example, the Commentator System is intended for use by professional commentators and as well as real time scores, has a strong emphasis on match statistics and player histories. Whereas the intranet system Wimbledon Information System (WIS) is intended for the general public and tennis fans has video content, useful information about Wimbledon, picture biographies and a real-time scoreboard. Each of the systems feed from a central backbone, which receives raw data such as rankings and biographies for men’s and ladies’ tournaments from the LTA and WTA respectively and real time scores, which are computed to form match statistics and histories, from courtside data-entry positions. The raw data that IBM provides through its own systems such as WIS, Commentator and the Web Site [1], also feeds the BBC with biographies and statistics in a graphical form. The Championships is an popular event attracting over 500,000 of attending fans, 3.2 million unique users to the wimbledon.org and nearly a billion viewers via TV, the Web and mobile devices in 2001. The Real Time Java Scoreboard represents a popular part of the Wimbledon Web site. In 2001 over 4.5 million scoreboards were launched, reflecting the demand for the real time information that IBM can provide [3]. 7
  • Michael Wong 151220 1.3 Web Services The Web is based on two core technologies TCP/IP and HTTP [4] [5] [6]. A standard HTTP get request is successfully responded to by returning the data referenced by the given URL, often an HTML document or data returned from an application such as a JSP, which may also be a HTML document. By presenting information as HTML, users can access in an open, standard fashion any document regardless of subject via a browser. The simplicity of implementation and standardisation of fundamental technologies accounts in part, for the exponential growth of the Web. As the Web continues to mature, there has been an increase in dynamic content. Information such as stock quotes, weather forecasts, banking details, stock control, and multimedia entertainment are just some of a handful of examples of commonly accessed dynamic applications. Web sites that providing dynamic content include: • BBC Weather [7], which provides detailed UK and worldwide weather reports based on town names, postcodes, UK and worldwide regions and city names. • American airlines [8] provide a dynamically generated, customised front end based on details supplied by the user. This Web site uses Broadvision one-to-one in order to generate content [9]. • O2 Online Shop – [10] provides an e-commerce front end where customers can search and assemble their desired product package. The O2 site uses JSPs in order to generate content at each stage of the purchase process [11]. Typically, e-commerce web sites deliver dynamic content to its visitors. For example, the process of searching an online product database will require an input from the user to generate a query conducted on the database and then a means of representing the results to the user. Technologies such as JSP and ASP allow connections to a database to be established, conduct queries and then display the results to via a dynamically generated web page. Real time delivery of data also falls within the definition of dynamic content. Examples include the Wimbledon Real Time scoreboard [1], which provides live scores, and statistics and Finance at Yahoo [12], which provides live streaming real time stock quotes to subscribers. Cheaper bandwidth, storage and the proliferation of new devices capable of accessing the Web from previously inaccessible geographies results in a continued growth of complexity. Despite different operating systems and devices with different requirements for presentation applications will still need to communicate with each other. The W3C states that: “The World Wide Web is more and more used for application to application communication. The programmatic interfaces made available are referred to as Web Services.” [13] Standard HTML documents possess insufficient expressiveness for supplying data necessary for application-to-application communication. For example, HTML possesses no means of representing arrays, or data types differentiating between an integer and a string. The formatting offered by HTML is intended for humans and not applications as end users. The W3C, in partnership with many major vendors including, IBM, Sun, Microsoft, BEA and Oracle, have been collaborating to establish standards in the form of Web Services that are capable of supplying data in a suitable format for application-to- application communication. So far, the fruits of their labours have resulted in three main technologies, which have been declared as the foundations of Web Services. These are SOAP, UDDI and WSDL. Work is ongoing and it is likely that Web Services standards will continue to be refined and added to. The architecture and implementation of Web Services is discussed in-depth in section 2.1. The Simple Object Access Protocol (SOAP) provides the mechanism for transporting XML data in a platform independent manner. Universal Description, Discovery and Integration (UDDI) provides a registry by which Web Services can be published, discovered and invoked. Web Services Description Language (WSDL) provides a language, again based on XML, by which Web Services can be described. In Summary, IBM’s tutorial describes Web Services as… 8
  • Michael Wong 151220 “..self-contained, self-describing, modular applications that can be published, located, and invoked across the Web.” [14] Small modular applications can be integrated to perform other functions to fulfil other higher levels needs. For example a corporation’s travel arrangements where smaller components for car, flight and hotel arrangements provided by different companies can be integrated to form a single point of access for a user within the corporation. To fulfil this requirement Web Services can exchange data in an open manner, which can be interpreted and are discoverable by other Web Services. 9
  • Michael Wong 151220 1.4 The Problem The demand for information about Wimbledon is high, with almost a billion people accessing information regarding Wimbledon via TV, the Web, radio and mobile devices. Further analysis reveals the level of demand through the Web, with which this project is primarily concerned. In 2003, Wimbledon.org recorded over 4 million unique users [15]. Despite slow global economic growth during the 2003, when compared with previous years the web usage statistics clearly indicate a continued growth of demand for Web-based access of The Championships information [16]. 2.6 million unique users were recorded in 2002, 3.2 million unique 2001 and 1.8 million users recorded in 2000 [17] [18] [19]. The number of users dropped in 2002 but increased again in 2003. The Real Time Java Scoreboard (JSB) [1] provides real time scores and statistics to the users that are running the JSB client. The JSB operates as a stand-alone application, which pushes scores point-by-point, real time to the user’s client. The Real Time Java Scoreboard (JSB) is a major focus of visiting users with 4.2 million Scoreboards downloaded in 2002, reflecting the demand for real time information [20]. Wimbledon presents a problem that is suitable for Web Services to solve. The problem faced by Wimbledon is an example of the desired application-to-application communication over the Web, which is made difficult by the absence of any existing mechanism to of discovery and delivery of information in a format that can be easily interpreted by the requesting party. Web Services have been implemented with success in non-real time applications, however real time Web Services are in a comparative phase of infancy. Considering this, the overall problem can be defined as follows: • The problem of how real time data can be packaged and distributed to other web applications. This can be subsequently divided into two smaller problems. 1) Ensuring the delivery of data within the predefined limits of ‘real time’. 2) Packaging data for distribution in a suitable format for web applications. Previous work [21] has been conducted in the problem of supplying Wimbledon data to other web sites using Web Services for non-real time data including news, photos and match reports. Building on work previously conducted the use of Web Services will be investigated to determine suitability of this architecture and its associated technologies for providing real time data for the JSB. 10
  • Michael Wong 151220 1.5 Aims and Objectives The overall aim of this project can be defined as: • To investigate and determine whether Web Services are a suitable means of packaging and distributing real time data. This overall aim being to assess the feasibility of deploying the Wimbledon Java Scoreboard as a Web Service. However, the broader context of the suitability of Web Services for real time data in distributed applications other than the wimbledon.org web site will be discussed. The primary objectives that are more specific can be defined and include: 1) To examine and assess the features of Web Services that may make them a suitable means of accessing and exchanging real time data. 2) Investigate aspects of Quality of Service, in particular response times when returning a range of data types under different conditions. 3) Analyse the results in order to gain an insight into the suitability of Web Services in delivering real time content. Secondary objectives of the project may also be defined, these constitute further research, which would be useful to undertake but not considered essential to this project. 1) Make predictions on the response times for the JSB, based on the findings from the primary objectives before converting the JSB to a Web Service. 2) Investigate the response times of the Web Service-based JSB implementation and analyse it correlation between predictions based on findings from primary objective 2, and actual results recorded. 11
  • Michael Wong 151220 1.6 Constraints Hardware The hardware available for testing includes an IBM PC 300pl and IBM Thinkpad 600x laptop spec. Although this is acceptable for small scale testing such as will be conducted in this project a more comprehensive study would include testing of Web Services upon hardware built typically used for web hosting. For example, the IBM P-Series server a Symmetric Multi-Processor server designed for use with UNIX and implemented by O2 to serve web content [11]. Software and Operating Systems The OS available for testing is Windows 2000 professional. Again, although this is acceptable for small scale testing it is unsatisfactory for the purposes of comprehensive testing. Given sufficient time, testing on a variety of OSs including Windows 2000 server, a number of Linux versions and UNIX variants would provide insights into the differences between OS performance in hosting Web Services. 12
  • Michael Wong 151220 1.7 Project Overview Chapter 2, ‘Review’ – In this section the relevant literature will be studied with the aim of better understanding of the issues, technologies and similar work related to real time Web Services. In the first section of the review, Web Services architecture and implementation will be examined in detail. In the second section analysis of the Intranet Java Scoreboard is offered and in the third section Benchmarking and Quality of Service (QoS) will be examined with particular attention to performance. Finally, a discussion regarding benchmarking and which aspects of Web Services should be measured is offered. Chapter 3, ‘Design’ – A detailed list of requirements for benchmarking is developed in this section. The decision-making processes and strategies employed in developing and implementing the test cases and procedures are documented and referenced against the requirements. Chapter 4, ‘Implementation and Testing’ – In this chapter, the main problems encountered and their resolutions are documented. Any modifications to the design are also justified and documented within this section. Chapter 5, ‘Evaluation’ – In the evaluation an assessment to the products (test cases) is given against the specification identified in chapter 3 and the aims and objectives identified in chapter 1. Analysis of the results of the test cases will also be discussed here, including findings and implications regarding real time Web Services. Finally a critique of the testing methodology will also be made. Chapter 6, ‘Summary, Conclusions and Future’ – An overall discussion of the project is offered here, including the original problem, the design and implementation and whether the project revealed any insights into the problem stated. Challenges are also discussed here and suggestions for continued future work. 13
  • Michael Wong 151220 2 Review The objective of this project is to assess the suitability of Web Services for real time applications. The motivation for this assessment arises in the form of the Java Scoreboard. Previously the JSB had been mentioned in the context of the wimbledon.org website, however, for the purposes of testing the suitability of Web Services for real time data, the Intranet version of the JSB will be considered. Considering the implementation of Web Services within an intranet environment is useful as it allows the suitability of the application of Web Services to be assessed in a contained and less visible environment. The Wimbledon Information System (WIS) is the intranet-based system, hosting the JSB. The WIS provides real time scores, statistics, biographies, video and other information for users on site during the two weeks of the Wimbledon Championships. Although less visible than the Internet site, it is visible to the general public, players, coaches and press as well as IBM employees and as such is not a company intranet, which is normally insular to employees. For this reason, the investigation of Web Services needs to be thorough, before the JSB is implemented as a Web Service. As noted before, the actual implementation of the JSB as a Web Service is not the primary focus of this project; the investigation of whether this is suitable is. 14
  • Michael Wong 151220 2.1 Web Services In the introduction, Web Services were introduced as discoverable, self-contained, self- describing modular applications that are suited for application-to-application communication. In this section an in depth discussion as to how Web Services deliver the described properties is offered. The architecture and operation of Web Services is also explored with attention to Quality of Service issues. The approach in this section will be to describe Web Services from a top down approach, first describing the roles and interactions of Web Services then drilling down to the architecture and then finally to examining the underlying technologies that implement these features. 15
  • Michael Wong 151220 2.1.1 Architecture Web Services are an example of a Service Oriented Architecture. That is, each service, which is well-formed and self-contained, makes available their resources and how to access and interact with them. Services connect with other services for the purposes of either data passing or co-ordinating an activity. Web Services operate independently of other services in fulfilling a particular function and can be integrated with other services in order to perform larger tasks. The key features of Web Services include modularity and flexibility based around industry standards that help simplify integration. The W3C Web Services Architecture Working Group (WSA WG) [1] distinguishes between a Basic and Extended Architecture [2]. The Basic Architecture is defined as the core roles and activities, without which Web Services cannot exist. The Extended Architecture is defined as the additional patterns and features, which may be important but not vital to the existence of Web Services. The Basic Architecture • The Service Provider – The Service Providers deploy Web Services on the Web. Deployed Web Services are made available by publishing their details to a Service Broker and described by Web Services Description Language (WSDL), which defines how to communicate and interact with the service. • The Service Requestor – The Service Requestor represents the party interested in accessing the Web Service. The Service Requestor queries the Service Broker for details about a required service, which then returns details about how to resolve and connect to the service. • The Service Broker – The Service Broker acts as an introduction service for the Service Requestor when locating and connecting to a particular Web Service. The Service Broker may be privately available such as through an intranet or extranet or publicly available on the Internet. Hence the availability of a Service Provider is partially limited by the visibility of the Service Broker it has published its details to. It should be noted that a Service Broker, for certain interactions may be by-passed, such as where the Service Requestor already knows the location of the Service provider, rather than discovering the Provider at run time. This requires that the Service Requestor possesses the WSDL document of the Service Provider or knows where to obtain it. However, for the purposes of an Internet wide system of service discovery, the absence of a searchable directory of Web Services available at run time would render Provider resolution extremely slow and unpractical. Therefore, the Service Broker is part of the core Web Services architecture. The roles described above and their behaviour is encapsulated by the following three named activities (see Figure 1 : Service Oriented Architecture [2]): • Publish – This describes the activity a Service Provider executes when it deploys a Web Service to a Service Broker or directory. The details of how to locate and communicate with the Web Service are also published to the service directory. • Find – This describes the process of locating a Web Service, where a Service Requestor contacts a service directory and searches for the required service. • Bind/Interact – Once the Service Requestor has obtained details of how to interact with the Service Provider, the interactions between the Service Requestor and Service Provider can occur. The coupling of requestor and provider is referred to as binding. 16
  • Michael Wong 151220 Figure 1 : Service Oriented Architecture [2] In this project, the primary area of focus is not on the finding or publishing of a Web Service but the interactions between a Service Requestor and Provider. 17
  • Michael Wong 151220 Extended Architecture The Extended Web Services architecture is defined as: “…incorporating additional features and functionality by extending the technologies and components defined within the basic Web Service architecture.” [2] Sect. 3.2 That is, features and functions that are extensions to Web Services and periphery to the Basic Architecture. The term periphery is not intended to imply that such features may be superfluous but to refer to a non-vital component of the abstract, conceptual Web Service. Some examples of features that fall within the scope of the Extended Architecture include: • Reliable Messaging – ensuring guaranteed delivery of messages between Web Services [3], • Attachments – the binding of two documents together for exchange between Web Services [4], • Message Confidentiality – transmission of messages to ensure that only the intended parties may read the contents of the messages [5], • Message Integrity – ensuring that messages can only be modified by authorised parties [5], • Message Routing – the dynamic specification and orchestration of message exchanges between Web Services [6] [7], More examples may be found in the Web Services Architecture Working Group Sect. 3.2. Parts of the extended architecture can be implemented with existing technologies. For example MQSeries [14] could be implemented as part of the underlying infrastructure supporting the Web Service to achieve reliable messaging. Attachments have been incorporated into SOAP 1.1 and can be used to bind two documents together for transport. However, development of Web Services Extended Architecture implementations is not formally regulated by w3c as the core architecture is. As a result, vendor specific implementations of some of the extended architectures, such as reliable messaging formats are possible. Web Services core architecture preserves interoperability such that extended architectures may be implemented in a modular, layered fashion, separate from the fundamental operations of the Web Service. Extended features of Web Services are relevant to the implementation of real time communication of data. Security of data is paramount, particularly where the value of data is tightly linked with the age of the data. Data must be received by the requestor within the agreed definition of real time and must also be done so securely to prevent unauthorised parties from accessing data. The implementation of additional security such as through the use of cryptographic techniques e.g. Encryption and Digital Signatures introduces an overhead. This increases the processing required to encrypt and decrypt data and thus increases the time taken to deliver data sent between Provider and Requestor. The result is an antagonism between trying to achieve low latencies and implementing sufficient security to protect the data. The impact and overhead of implementing extended features is of secondary importance in this project but is occasionally discussed as a related issue. 18
  • Michael Wong 151220 2.1.2 SOAP, WSDL and UDDI The integration of Web-based applications often faces difficulties because of non-standard means of communication. That is, the formats and mechanisms to deliver information differ, requiring additional systems to translate and reconcile how applications interact and data received and sent. Web Services greatly reduce the integration costs by standardising the formats of data presentation. Also provided is a standard means of describing how to interface and interact to the service and a means to discover the service. The technologies used to provide these defining features are XML and SOAP, WSDL and UDDI. This section explains the purpose of each of these technologies and their function within Web Services. 19
  • Michael Wong 151220 XML Xtensible Markup Language [8] is a flexible way of structuring and describing information. XML can be used to annotate, or markup, data. Its flexibility is that it allows programmers define their own tags and use them to markup the data within a document. Because of this data described in XML can be easily understood by humans, through the use of appropriate naming conventions and also easily interpreted into programming data types by applications, through the use of an XML parser. Figure 2 : Roads - XML Example <?xml version="1.0"?> <roads> <motorways> <motorway>M25</motorway> <motorway>M4</motorway> <motorway>M275</motorway> </motorways> <a-roads> <a-road>A3</a-road> <a-road>A31</a-road> <a-road>A331</a-road> </a-roads> </roads> Figure 2 shows some example XML is whereby information about roads can be categorised and tagged. The resulting structure as inferred by the in order of tagging is as follows. Figure 3: Roads – Data Structure roads Elements motorway s a-roads Data motorway motorway motorway a-road a-road a-road m25 m4 m275 a3 a31 a331 In Figure 3, the grey nodes represent the elements, the white nodes represent the data included within the tags. Thus with XML data types can be defined by the programmer and expressed in a format where structure can also be applied. Other XML classes also contain DTDs, XML Schemas and XML Namespaces. Document Type Definitions – DTDs [9] are optional in XML documents. Essentially, DTDs are a set of rules defining the elements, attributes and structure of the document. They are embedded within the XML document and validate the data contained within a given XML document. In terms of Web Services, this reduces the processing required by the application as validation can be delegated to the XML parser rather than being processed by the application. Furthermore, as DTDs are declarative rather than procedural as most application code is, DTDs make validation code easier to maintain [10]. XML Namespaces [11] – Within a single XML document it is possible to include information for multiple purposes. The problem with this is how to distinguish which elements belong to which purpose. In particular, which elements describe the document properties and 20
  • Michael Wong 151220 which elements are relevant to the application. For example, consider an eCommerce application where requests are posted using XML. Potentially information expressed as elements for message sender and recipient, timestamp, billing, posting, referencing and stock order may be packaged up within one XML document. For the purposes of book keeping and order processing it is necessary to define which pieces of information belong to which purpose of category. For example billing information may be kept separate to the message timestamp. This can be accomplished by namespaces, which takes the same approach as packages in Java. Namespaces are expressed as uniform resource identifiers – URI’s (RFC 2396) and are associated with a prefix. This prefix is combined with the element as prefix:elementName to provide a means of separating XML elements according to the programmers purposes. XML Schemas [12] – DTDs provide a means of automating the validity checks performed on a XML document but fail to address the integration of namespaces and the mapping of XML to data types. XML Schemas are an attempt to address the issues of integrating namespaces and mapping of XML to data types as well as maintaining the flexibility that the programmer has when writing plain old XML. XML Schemas have been designed with reuse and extensibility in mind. As XML Schemas are written in XML they allow the programmer freedom to define and write schemas as freely as XML documents. There are of course conventions that govern this process. For example, XML Elements should be associated with a basic data type, and elements with attributes. Complex data types may also be defined and should always be formed from compositions of basic data types. XML Schemas are complex but provide a way of integrating validity checks, XML element to data type binding and namespaces in a modular fashion. They also maintain the extensible development that plain old XML affords the programmer. XML Schemas can be reused and used in conjunction with other schemas and allow custom data types to be defined as long as they are compositions of base data types. A more detailed explanation of XML and XML Schemas is available from W3C [12]. 21
  • Michael Wong 151220 SOAP The Simple Object Access Protocol (SOAP) provides the transport mechanism for sending XML documents and attachments in Web Services. The W3C define SOAP as: “a lightweight protocol for exchange of information in a decentralized, distributed environment.” [13] In order to act as a requestor or a provider a device needs to be able to build and/or parse XML messages and have a network connection available. A primitive exchange of SOAP request/response is described below. 1) The Service Requestor creates a SOAP message. Here the SOAP message is a request. Within the body of the message, a XML document represents the request as either a Remote Procedure Call (RPC) or a document-centric call. A RPC call represents a call to application logic, such as an entry point into an application. A document-centric call presents no call to the application but merely application data only. The interpreted data determines its operation. Regardless of the request format, the message is presented to the SOAP runtime client with the network address of the Service Provider and then transmitted according to the defined lower level application layer protocol. This protocol is commonly HTTP although implementations over other protocols such as SMTP and HTTPS are also possible. 2) The SOAP message is then delivered to the Service Provider over the network infrastructure. If application specifics are defined, the SOAP runtime is then responsible for the conversion between XML and the application format. This conversion is governed by encoding schemes found within the message, as defined by the XML Schema. The result of the SOAP message processing is then passed to the Web Service. 3) The Web Service then processes a response. The response, which is also encoded as XML is passed to the SOAP runtime for transmission with the destination of the Service Requestor. As a side note, extended features such as asynchronous or synchronous messaging are governed by the underlying infrastructure. For example, MQSeries [14] could be implemented for guaranteed delivery of asynchronous messages, but the details are kept separate from the implementation of the Web Service. 4) The response message is routed through the network infrastructure to the Service Requestor. The Service Requestors’ SOAP runtime client interprets the message, converting any XML defined objects before presenting the response to the Service Requestors application. Other primitive exchanges are also possible such as a one-way request that results in no response from the recipient, a push style notification, and a publish/subscribe mechanism. Interactions that are more complex can be defined including a conversational and many- to-many communications. These can be defined by choreography language, which is part of the WSDL definition. The permutations of more complex choreographed exchanges are formed from compounds of primitive exchanges. Therefore, for the purposes of studying the suitability of Web Services for transmission of real time data, the focus of testing will be primitive exchanges between Service Requestors and Service Providers. It is hoped that the study of primitive exchanges will provide insight into the basic operations of Web Services, which can be used to make certain predictions regarding complex choreographed exchanges. Composition of SOAP Messages [13] A standard SOAP message is comprised from three main parts. They are the SOAP envelope, SOAP headers and the SOAP body. • SOAP Envelope – The SOAP envelope is relatively simple, consisting of only a few XML elements. However, it is a mandatory part of any SOAP message as it communicates fundamental information necessary for distributed processing of XML documents. Within the SOAP envelope, information regarding the contents of the message, the intended recipient and whether the data is optional or mandatory. In every SOAP message, the root element is the envelope element. 22
  • Michael Wong 151220 Within SOAP 1.1, this element falls within the http://schemas.xmlsoap.org/soap/envelope namespace. As the Envelope is uniquely identified by this namespace, it allows processing tools to immediate identification of a valid XML message as a SOAP message. • SOAP Headers – SOAP Headers are optional to a SOAP message. They are used to encode information that is not relevant to the SOAP Body, for example data relevant to the any implementations of extended Web Services architecture. Examples of data that might be carried in SOAP headers include information relevant to security mechanisms such as authentication and authorisation. • SOAP Body – The SOAP body can contain arbitrary XML. It can contain SOAP RPC calls, error messages and application data. According to the purpose of the XML document, different conventions govern the format. For example, SOAP requests, whether they are RPC or document centric will be based on conventions that will not apply to defining application data. WSDL [15] Web Services Description Language (WSDL) is also based on XML and defines a Web Service and how to communicate and exchange data. WSDL describes three fundamental aspects of a Web Service, which include: • What a service does – the operations and methods that the service provides • How to access a service – detailing the protocols and data formats necessary to access the services’ methods • Where a service is located – the network address of the service, such as a URL [16] The WSDL schema defines a set of high level elements necessary for describing the above criteria. These are defined as abstract and then bound to concrete implementations to make them available. The elements are: • portType – defines abstract interfaces to an exposed procedure, termed “operation”. Typically a Request-Response operation defines an input and an output message, but may only define an input message (one way request) or only an output message (one way notification). • message – defines abstractly, the definition of data to be communicated. A message may optionally be decomposed into parts. For example, a RPC call might define parameters, which can be expressed as parts. • types – defines all data types used in the Web Service to describe the messages exchanged. • binding – defines how the abstract representations of the portType are to be implemented. For example whether an operation is an RPC call or document centric and the encoding schemes used, such as SOAP over HTTP.. • port – defines how a binding is be expressed at a network endpoint. Basically an address, typically a URL. • Service – A named collection of ports. It is possible for a WSDL document to describe multiple ports as necessary for a multi step process, where multiple Web Services may be contacted. [15 ] The combination of these elements allows the communication end points to be described in sufficient detail such that Web Services may communicate autonomously with each other. Although WSDL can be written manually for a Web Service, many vendors development kits include tools which generate WSDL from Java or vice versa. This code can then be modified for the purposes of the particularly implementation, tweaks necessary for this project are described in Section 4: Implementation and Testing. The result is much faster development and fewer errors introduced through hand written code. In summary the WSDL document for a given Web Service is essential for communication between Web Services. The WSDL may be posted to a registry so that services may dynamically bind and connect to the service or distributed directly to the providers as a 23
  • Michael Wong 151220 static means of interacting with the service. Further details of WSDL can be obtained from W3C [15]. 24
  • Michael Wong 151220 UDDI [17] In order for a Service Requestor to contact a Service Provider a means of discovering available services is necessary. The analogy offered by Graham et al 2001 in “Building Web Services with Java” is that of a Java programmer browsing Java API documents during development. That is, a repository containing details of Web Services that can be browsed and queried is necessary for service discovery. Universal Description, Discovery and Integration is a Web based distributed directory. It acts like a phone book and provides a means to discovering Web Services. From a business perspective a business will register with one of the UDDI Operators, IBM, Microsoft or Hewlett Packard. The UDDI Operator that has been registered with will then replicate the new entry so that the other UDDI Operators registries also possess the entry. UDDI possesses two fundamental data structures; the business layers and tModel [18]. The business layers can be conceptually divided into three pages. It is worth noting that UDDI does not provide a formalized structure to represent the pages as different entities, rather it is a conceptual model of the information provided. The three pages are defined as: • White pages – containing general contact information regarding the entity represented by the Web Service. E.g. name, address, email address, telephone number etc. • Yellow pages – containing information about the types of service offered. For example, a Building Society offering mortgages. • Green pages – containing information about how to invoke the service. If a building society were to offer mortgage quotes online over the web, a URL would be supplied for this purpose. The business entity provides all the necessary information to find an appropriate Web Service, who is providing it and how to bind to it. The tModel represents an abstracted set of service definitions for a type service. The principle of this is that other similar Web Services that might be supplied can reuse the definition, substituting abstracted information into concrete specific information. For example, a banking consortium may set up a collection of standards to enable smooth integration of transactions between specific types of Web Service and publish them as a tModel. Any banking Web Service that conforms to a given tModel specification can therefore guarantee that it will supply a minimum set of information before binding occurs. This use of the tModel to define pre-arranged technical agreements is known as a Technical Fingerprint [19]. UDDI pages and tModels are both expressed using XML. XML’s extensibility allows for a platform independence that contributes to achieving the goal of an open system of locating and binding to services. 25
  • Michael Wong 151220 W3C’s View on SOAP and WSDL During the early stages of this project, it was thought that SOAP and WSDL were an integral part of Web Services design and therefore Web Services would inevitably be implemented with SOAP and WSDL. However, W3C states that: “This ‘blessing’ of SOAP and WSDL is not logically necessary… Perhaps in the long run, other technologies will supplant SOAP and WSDL…” [1] Sect. 2 That is to say that another more suitable mechanism of gathering XML documents into a form suitable for transmission may in the future replace SOAP. The W3C Web Services Architecture working document also notes that another description mechansim could be employed, such as DAML-S. [DAML-S] Upon initial discovery, the possibility of more suitable technologies replacing SOAP and WSDL could be cause for concern in that it would render studies into Quality of Service and Security of SOAP and WSDL redundant. However, the w3c article also states that, “…the WSA WG believes that a common foundation is a *practical* necessity for the industry to move forward with additional Web services functionality, including security..” [1] Sect. 2 and because of this, “WSA reference architecture builds on SOAP and WSDL as the basis for messaging and description. Specifications that conform to the WSA reference architecture MUST use SOAP and WSDL when appropriate.” [1] Sect. 2 As the Web Services Architecture Working Group (WSA WG) states, a common agreed set of foundation technologies are necessary for progress to be made. Therefore, it is a necessary for studies of current foundation technologies to take place, in order to iteratively refine and extend the Web Services stack such that it is suitable for industry use. Additional factors such as Management of Web Services, Security and Quality of Service (QoS) are viewed as “overarching” concerns. That is, they are issues that encompass the entire Web Services stack including roles and technologies of the basic and extended architecture. It is Quality of Service that this project is primarily concerned with. 26
  • Michael Wong 151220 2.2 Web Service developer kits - hosting platforms Many of the major vendors have embraced Web Services as a model to enable Web based applications to communicate and integrate with each other easily. As a result, a variety of ‘kits’ to host and develop Web Services are now freely available. These kits are often bundles of components necessary for publishing and writing Web Services along with an application server to host the Web Service. The purpose of these kits is to provide developers with tools to test and deploy Web Services small scale, rather than hosting enterprise scale applications. The JSB being considered is the Intranet version with a maximum number of concurrent clients of 56 [1] and a standard level of concurrency at 10. The relatively low number of concurrently connected clients (when compared with the Internet JSB) and the assessment purposes developer kits allow for an appropriate match between developer kit and application for investigation. As there are a variety of kits available it is prudent to investigate the available options. Potentially, differences between the kits may make a specific platform more suitable than others for the implementation of the JSB as a Web Service. It is intended that benchmarking and tests of JSB interactions will be performed across a variety of Web Services hosting platforms. 27
  • Michael Wong 151220 IBM’s Web Services Developer Kit IBM’s Web Services Developer Kit (WSDK) provides a complete Web Services infrastructure, with application server. Version 5.0.1 contains the following components [2]. • Application Server - A lightweight version of WebSphere application server (WAS) Express v5 with support for EJB’s and ORB. • Support - SOAP 1.1, WSDL 1.1, UDDI 2.0, JAX-RPC 1.0, EJB 2.0, Enterprise Web Services (JSR 109) 1.0, WSDL4J, UDDI4J, Soap with Attachments API for Java (SAAJ.jar), • Tools – To publish JavaBeans and stateless session EJBs as Web Services, creating Web Services from WSDL and publish and unpublish Web Services to UDDI. TCP Monitor to monitor Web Services messages being exchanged. SOAP Monitor to monitor SOAP messages being passed between roles and components. • WS-Security – extensions include digital signatures and XML encryption • An entry level database with JDBC connection • IBM Java SDK 1.3.1 • A variety of documentation and reference material, including samples, tutorials and concepts. Sun’s Java Web Services Developer Pack Like the WSDK, Sun’s Java Web Services Developer Pack (JWSDP) also provides a complete Web Services infrastructure, including an application server. Version 1.2 includes the following components [3]. • Application Server - Apache Jakarta Tomcat v5 application server • Support – SOAP 1.1, WSDL 1.1, UDDI 2.0, JAX-RPC 1.1, Soap with Attachments API for Java (SAAJ.jar), • Tools – Ant 1.5.2, a platform independent build tool [4]. TCP Monitoring (as in WSDK). • Security – Apache XML Digital Signatures based on W3C standard. Sample application allowing the developer to digitally sign SOAP messages. • JavaServer Faces (JSF) v1.0 EA4 for developing user interfaces. • JavaServer Pages Standard Tag Library (JSTL) v1.1 EA representing common tags used in JSP pages to simplify page development [5]. • Ws-I Supply Chain Management Sample Application 1.0 EA example Web Services application. Apache AXIS : Apache eXtensible Interaction System The Apache AXIS Web Services framework provides SOAP messaging framework from which Web Services can be implemented. The recommended application server is Jakarta Tomcat, which AXIS is then installed into with Xerces XML parser. Features of Apache AXIS [6] • Application Server – Apache Jakarta Tomcat 4.1.24 (recommended). The AXIS Web Services server is pluggable and could, in theory, plug into other servlet engines. • Support - Soap 1.1/1.2, WSDL 1.1, JAX-RPC 1.0, WSDL4J, EJB, Soap with Attachments API for Java (SAAJ.jar), session-oriented services via HTTP cookies or transport-independent SOAP headers • Tools – Java from WSDL, WSDL from Java, Ant 1.5.2, a platform independent build tool, TCP Monitoring (as in WSDK), SOAP Monitoring (as in WSDK). • Security – can be integrated with Servlet 2.2 roles and security There are also other Web Services development and test platforms available, such as Microsoft’s Web Services offerings [7]. The Microsoft offering has not been included in the list of platforms to test as it does not support Web Services development in Java, only in Visual Basic.net and C# [8]. As the JSB is implemented in Java and the Intranet Producer does not intend on porting the JSB to another implementation language, Microsoft’s Web Services offering has not been included in the list of relevant kits to be tested. Core Offerings 28
  • Michael Wong 151220 The development kits listed offer common basic functions. They all offer support of SOAP, WSDL, JAX-RPC and a Registry Server. At the time of writing the kits, all offered the same version of support for these core modules with two exceptions. Firstly, Apache AXIS notes that it supports SOAP 1.1/1.2. By this it means that full support for SOAP 1.1 is available and AXIS SOAP also implements some of the features that will comprise SOAP 1.2. Apache AXIS notes there is still much work to be done before SOAP 1.2 is complete [9]. Apache AXIS 1.0 is implementing a form of SOAP 1.2 beta. The second exception is that Suns’ JWSDP includes support for JAX-RPC 1.1 where as IBM’s WSDK and Apache AXIS support JAX-RPC 1.0. JAX-RPC 1.1 differs from JAX-RPC 1.0 in that it adds support for Web Services Interoperability Organisation (WS-I) basic profile 1.0 [10] [11]. Application Server IBM’s offering includes a lightweight version of their WebSphere Application Server (WAS) Express v5. Sun’s JWSDP comes packaged with Apache Jakarta Tomcat version 5, including the Tomcat Servlet and JSP container. Apache AXIS 1.0 recommends an installation of the latest version of Tomcat 4.1.x [12], which has been followed. Prior to testing, the difference in performance of these application servers is unknown. Amongst other improvements, Apache claims that Tomcat v5 has performance optimisations over v4 [13]. It is unclear how these optimisations will affect the performance of Web Services although it is noted as an important contributing factor. It would be interesting to study the effect on performance of different application servers with the different core offerings from each of the vendors. The possible areas for future work are discussed further in section 6: Conclusions – Suggestions for further work. Tools The WSDK implements AXIS but does not expose the programming model. That is, through IBM tools the developer code is deployed as a Web Service, however it is not possible to extend the AXIS model by using the WSDK tools. This is potentially restricting as it makes customising the Web Services engine, such as SOAP handlers difficult but affords focus on the implementation of Web Services rather than the background operation. IBM’s WSDK provides many tools for publishing and creating Web Services where as Suns JWSDP provides relatively few. This is a concern, as for accurate comparison the same test cases need to be implemented on all three platforms. If fewer tools are available it is possible that some code will need to be written on one platform that is automatically generated on another. This may introduce discrepancies in the test cases as a result of differing programmer skill between the writers of the tools and the person writing the test cases. However this also presents an opportunity to assess the degree of interoperability of Web Services, not from the perspective of end points but the portability of application code and re-use across platforms. Web Services forte is declared as ease of integration and interoperability, one of Java’s key features is platform independence. In observing the effectiveness of code re-use between the different vendors platforms it will reveal the differences between implementations of shared objectives and technology. Considering this, the implementation of test cases will attempt to re-use as much code as possible. The results of the attempted testing are discussed further in Section 6: Conclusions. In Summary, given that there are differences in tools, core libraries and the application servers offered (or recommended in the case of AXIS); it will be difficult to define the exact cause of any difference in performance without further testing. However, an overview study of the Web Services development kits available does not require that the exact same tools and libraries are tested. The most important factor is that the kits tested are equivalent in intended purpose and function. The five high level test cases defined in the JSB Interaction analysis section and the test cases outlined in the benchmarking section are intended for testing on all three listed kits, under the same conditions. In this case, all the kits are intended for testing and exploration of Web Services, rather than enterprise Web Services implementation. A primary objective of the design is to ensure that the conditions for testing are fair. 29
  • Michael Wong 151220 2.3 Quality of Service – Performance and Testing Understanding performance and what its relevance to distributed systems and in this case Web Services is vital. From this understanding, pertinent test cases can be generated in order to assess the suitability of Web Services for real time applications. Mani and Nagarajan define performance in the context of Web Services as, “…the quality aspect of Web service[s], which is measured in terms of throughput and latency. Higher throughput and lower latency values represent good performance of a Web service.” [1] Throughput means the number of requests processed within an arbitrary period of time. Latency refers to the quantity of time that has passed between the submission of a request and a response or the return of a result. In order to understand why throughput and latency are important to performance, it is useful to examine what relevance performance has in the wider scope of distributed computing. Coulouris et al. state that, “[in a distributed system]…The main non-functional properties of systems that affect the quality of service experienced by clients and users are reliability, security and performance”. [2] Although there are other factors attributed to QoS the three factors of reliability, security and performance are defined as properties that affect the level of quality of service (QoS) experienced by users. Put differently, when a user is interacting with a system, the level of QoS they experience will be most apparently affected by factors of reliability, security and performance. Reliability Reliability means how dependable the system is; in particular how dependably the system can fulfill its’ objectives. If it is known that a system will be offline on Sundays but is available 99.99% of the time, from Monday to Saturday it is still said to be reliable; the system is said to be reliably available within the defined limits. Similarly, a system that can deliver error free services to up to 100 concurrent users but above 100 users, frequently experiences failure can also said to be reliable, in the sense that it can be depended on to function within known limits. Reliability is related to failure. The more predictable the rate of failure is and the more readily it can be remedied or prevented, the more dependable the system is. A system should be designed such that technology and processes are designed to ensure the reliability of its services and not detriment reliability by introducing unmanaged complexity. More detailed discussion on the topic of Reliability is widely available examples of which are noted in the references [3]. Security From an architectural perspective of security in distributed systems, security can be achieved by securing processes and interactions and protecting the objects they encapsulate against unauthorized access. Security affects the Quality of Service experienced by the user in positive way, by protecting their information and ensuring that only authorized parties are involved in process interactions. However, ensuring security can also pose potential challenges, such as increasing performance overhead required by cryptographic techniques, such as encryption, digital signatures, hashing functions etc. Security can also impede usability, another factor of QoS [1]. For example, as noted by Nielsen, ‘secure’ passwords containing random characters should be distributed for each of the users applications. However, this impedes usability and an individual using fifty applications is unlikely to be able to recall apparently random passwords. In this situation applications become unusable, therefore users may even resort to recording passwords in a machine readable, centralized location such a plain text file on their workstation [4]. 30
  • Michael Wong 151220 More detailed discussion on the topic of security can be found from many sources, some of which are listed in the references [3] [5]. Further issues of QoS QoS involves many different aspects, not all of which are listed here. However, of the general themes mentioned, it is apparent that the different aspects of QoS are inextricably linked. For example, implementing computationally expensive encryption, such as RSA to improve security inevitably affects performance by increasing the demand for system resources. The new components introduced for increased security will require, at least server side, performance tweaks to be made to maintain the same performance of throughput and latency. This could be in the form of additional hardware or perhaps new resource management objectives to be made, regardless of how, it will require changes to be made within the system that if incorrectly managed will negatively affect reliability and performance and thus QoS. Ideally, it would be possible to produce a piece of code that could analyze a system and return a set of results detailing the circumstances when the system would fail, under go performance difficulties or crash. Although tools exist for testing and code instrumentation, such as Loadrunner [6] some eventualities cannot be predicted. One such example is the halting problem where, determining whether a program will terminate or not is undecidable; it is an incomputable problem. A thorough explanation of the proof of this can be found in Gödel, Escher, Bach: an Eternal Golden Braid by Hofstadter. In the absence of a tool to analyze fully a given application for halting, performance bottlenecks and failures, it is acceptable to test and build models of the system to be implemented. This affords an opportunity to gain insight into how the system will perform, what sort of behavior to expect and some indication of the expected QoS. To this end, this project focuses on the performance aspect of QoS, for which test cases will be designed with the aim of providing a basis for estimating the performance of real time applications implementing Web Services. Performance Throughput Returning to the factors of throughput and latency in Web Services, the test cases developed will focus on how these factors change in response to varying loads and different message exchanges. Throughput is usually defined as the number of items processed. In the context of Web Services, the items we are processing are ‘requests’, fulfilled by ‘responses’. Within the context of the tests to be considered, the System throughput would relate to the Web Service implementation of the JSB. How many requests the Web Service could process and remain within acceptable limits. The tests defined for each of the specified JSB interactions would relate to Component throughput metrics as they have been abstracted from the larger system of the JSB. Latency Latency is defined as: “The delay between the start of a message’s transmission from one process and the beginning of its receipt by another…” [2] Latency can be impacted by many other factors. Network issues are a common cause of high latency. For example, a busy Ethernet based network is more likely to experience collisions of data packets. In an effort to prevent collisions, Carrier Sense Multiple Access with Collision Detection (CSMA/CD) will back off and delay transmission until the line is detected to be clear again. The result is an overall delay for packet transmission between the sender and receiver. As link utilization increases, higher latencies are be expected. More details on CSMA/CD can be found in Tanenbaum [8]. Further reasons for high latencies include router utilization; as router processor load approaches 100%, backlogs of packets for transmissions begin to form and some packets may be lost as backlogs become filled. The result is slower routing and for retransmission of lost packets resulting in a greater overall latency. Firewalls also undergo the same issues as routers of over utilization and malicious attacks in the form of Denial of Service attacks, which result in 31
  • Michael Wong 151220 over utilization [9]. As latency will inevitably affect the round trip time of the tests it is important that any extraneous factors are absent when testing is conducted. Considering this, testing will be conducted in an environment where firewalls and routers are absent, and network traffic is silent except for the tests being conducted. Within the context of QoS in Web Services latency is also defined as: “the round-trip time between sending a request and receiving the response.” [1] It is this round trip time that this project is primarily concerned with. Round trip times are pertinent to this study as from a user perspective fluctuations most observably impact QoS. This definition of latency encompasses the previous definition of network latency, the time taken for a message to be sent, receipt by the provider and in a request response interaction, the execution of server side processes and the return of response to the requester. The inclusion of requestor and provider processing within the measurements taken is important as it accounts for the additional overheads that Web Services impose, such as marshalling and conversion of XML and SOAP. Understanding the impact of this overhead is central to estimating the suitability of Web Services for JSB implementation and potentially other real time applications. The round trip time of an interaction is also subject to the throughput thresholds of the application. As the threshold is reached, the application will respond more slowly as requests become back logged, therefore increasing the round trip time of the request. This factor is acknowledged as a contributing factor and forms a secondary objective - to examine the impact of a heavily loaded application on the round trip time of the request/response. 32
  • Michael Wong 151220 2.4 Java Scoreboard Architecture Figure 4 shows the overall operation of the Java Scoreboard. The Java Scoreboard server operates as a stand alone application. Client-side applets are sent to the client over HTTP. The following sub-section describes the operation of each of the components of the Java Scoreboard. The Datafeed and database servers Datafeed: Tennis matches on show courts, Center Court, Courts 1, 2, 3, 14 and 18 have live data entry. This involves teams of tennis experts entering into a customised application, details of the game, including scores and statistics. Each time a point is completed the details of the point and associated statistics e.g. speed of serve, is broadcasted in a NetBIOS frame [1] across the IBM network at Wimbledon. The NetBIOS score broadcast is detected by an application known as datafeed. The datafeed takes these scores and writes them to a DB2 [2] database that feeds the Java Scoreboard server. The Trigger and UDF: Housed in the DB2 database is a trigger that detects when the database is updated. Once the database is updated, the trigger calls a User Defined Function (UDF). A UDF allows SQL to be extended to incorporate functions not present in the standard set offered by DB2. In this case, the UDF is written in Java but may also be implemented in C or C++. When the database is updated, the UDF notifies the JSB Server on port 7777. An instance of the Connection class detects and recognizes the communication on port 7777 as from the database. The retrieval of new scores from the database is then initiated. The process of datafeed writing to the database and the trigger initiating a notification from the UDF is ongoing for the duration of live matches. The JSB Server Server: The server class is a singleton class that runs throughout the life of the application. Once the server class has been instantiated, it creates instances of the Vulture, CubbyHole and IncrementalUpdate classes. The Server class is also host to a Server socket, listening for clients requesting a connection. When a client connects to the Server, it spawns a new instance of the Connection class for each client and then assigns it to a thread group. Connection: The Connection class is responsible for handling all communications from the database and for the connected client for which it has been spawned. Communications from JSB clients are always through port 6666 whereas communications from the database via the UDFs are always through port 7777. If a communication through port 7777 is detected, the Connection class does a quick check on the format of the notification to ensure it is valid, calls the IncrementalUpdate (twentyCourtA) class which returns the full, updated statistics and then stores them in the CubbyHole. If a communication arrives through port 6666 and a score has recently been updated into the CubbyHole, the Connection class retrieves the score and posts it onto the clients’ socket. If no new score has been retrieved since the client last polled, the CubbyHole returns a “NoNewScore” value, which is posted to the clients’ socket. IncrementalUpdate (twentyCourtA): The IncrementalUpdate class has be renamed for the purposes of ease of reading. In the actual application there are two classes with the same name but different functions. The “UpdateByPolling” or “twentyCourtB” class is packaged with the client side classes and is used only once when the client is first instantiated for retrieving the current scores and statistics by polling the database. The “IncrementalUpdate” or “twentyCourtA” class is maintained server side and is responsible for the ongoing task of fetching and publishing updated scores. CubbyHole: The CubbyHole acts as a repository for current up-to-date scores. It also tracks an ID of the current score. Whenever the CubbyHole is checked for a new score it 33
  • Michael Wong 151220 compares the ID of the most recent score update from the client has against the current score code. If the score codes are found to be equal, the CubbyHole returns the “NoNewData” message; otherwise it returns the new score. Vulture: On 500 ms intervals, the Vulture checks a vector of live connected clients, represented by instances of the Connection class. Any not live threads are removed from the vector, thus acting as an ongoing house keeping operation. JSB Client Twenty: When a user first navigates to the page hosting the JSB, the Twenty, StreamListener and UpdateByPolling classes are downloaded. The Twenty class is primarily responsible for drawing the scoreboard and updating the graphics. It is the first class to be instantiated and is also responsible for instantiating the StreamListener and UpdateByPolling classes. StreamListener: The StreamListeners first operation is to call the UpdateByPolling class to obtain a set of results. It then maintains a “thin” connection, polling JSB Server side application every 50 ms for updated scores. By “thin” it is meant that the connection does not transfer any considerable data when polling, but merely checks for the existence of new scores. Only when new scores are available does any transfer of data occur. UpdateByPolling (twentyCourtB): This class contains methods that are invoked only once, upon the instantiation of a new scoreboard. It connects directly to the database feeding the Java Scoreboard server and executes the necessary SQL to obtain a full set of current results. This is returned to the Twenty class where the results drawn to the applet. This is the only function of the UpdateByPolling class, after which it terminates. 34
  • Michael Wong 151220 Figure 4 : Java Scoreboard Interactions Database side operation Stats f rom data entry are updated into the database. A trigger notif ies the UDF (db2 jav a f unction) that new stats are present in the database. The UDF propagates the notif ication to the host of the JSB on port 7777, which all connection classes can see. Datafeed: Update of stats fields from DB courtside data entry f ields DB2 : Wimbliv e Dataf eed and Database serv ers Trigger UDF Serv er Side Operations g ongoin The Serv er class is responsible f or managing client connections. It is a Serv er socket which spawns a new client socket and Connection class (A). The connection class handles all client JSB Serv er communications. When an update f rom the UDF arriv es on 7777, the Connection class calls a method in the Incremental Vulture Connectionclass update class (serv er side twenty court). This f etches and returns the updated data to the CubbyHole connection class which then stores the data in the Jav a Scoreboard cubby hole until it is requested f rom the client. (see Serverclass Serv er IncrementalUpdate StreamListener "thin" connection). (twentyCourtA) 1& 2 - StreamListener "thin" connection When a new score is reciev ed it is placed in thecubby hole. (A) On startup of each new client The StreamListener polls the Jav a Scoreboard Serv er on port 6666 (1), the Connection class picks up the poll and checks the cubby hole. If a new score is detected the score is written to the ports out stream, so the streamlistener can reciev e the new score. The score is then taken pulled f rom the socket by the 1 2 streamlistener (2). terminate client side Client Side Operation When the browser nav igates to the 20 court StreamListe scoreboard page the class "Twenty " is ner instantiated. Twenty instantiates a StreamListener and the UpdateByPoll UpdateBy Pollclass. Twenty (twentyCourntB) Client Web The StreamListener on f irst operation calls the Browser UpdateBy Poll class to get a complete set of results which is then passed back to Twenty f or drawing to the scoreboard. The StreamListener continues to maintain a "thin" connection, polling the socket f or an update in scores. (1) 35
  • Michael Wong 151220 2.5 Java Scoreboard Interaction Analysis Having examined the JSB architecture it is apparent that there are a number of possible optimisations that will improve the performance. Some possible optimisations include: • Implement new socket functions to allow push style notifications. This would eliminate the need for “thin” client connections, polling the server on 50 ms intervals; an avoidable overhead [1] [2].  Possible to implement some form of messaging software e.g. JMS or Mqseries such that delivery of data is guaranteed [3] [4]. Separation of concerns away from JSB to a more modular fashion. Although there are potential optimisations to the JSB, the objective of this project is to assess the suitability of Web Services for Real Time applications using the JSB as an example. The chosen method of assessing this is to examine the JSB in its current form, i.e. architecture and operation, and to implement tests relevant to this form. It is a possible area for future study to examine the results of this project and specifically study performance-tuning applications for Web Services. The practical aspect of this project shall not be performance tuning the JSB but assessing the performance of Web Services. In considering the implementation of a Web Service JSB, the tests to be implemented shall be selected to reflect the current architecture and operation. That is, regardless of any potential future improvements, the tests must be pertinent to the existing JSB. Figure 5 abstracts from the JSB architecture the key interactions involved in initialising and updating both client and server side of the JSB. The interactions are projected into a suggested implementation of a Web Service JSB, preserving as much of the original architecture as possible. Here follows an attempt to analyse the interactions and define high-level test cases pertinent to assessing the suitability of JSB for implementation as a Web Service. Figure 5 : Java Scoreboard Web Service Interactions Dataf eed and Database Datafeed: Update of serv ers stats fields from DB2 courtside data entry 4. Collect and Update Connectionclass IncrementalUpdate Serverclass Jav a Scoreboard 2.UpdateByPolling (twentyCourtA) Serv er 1. Confirmation 3. Response 1. Request 5. terminate JSB Serv er Service 3. Check / / update Poll Client Side Client Web Browser UpdateByPoll StreamListe (twentyCourntB) ner 36
  • Michael Wong 151220 1. Request Service (optional confirmation) – This represents the request for the service. Potentially, the availability of the service as in the original JSB could be assumed. Therefore if a direct translation of the JSB Client Server Model into the Web Services model is to take place a simple request with no acknowledgement would be implemented. As this is the assumed case, the first Web Services test case is: “a single one way message request” 2. Update by Polling – During or after a connection has been established to the Service Provider, the Requestor will attempt to poll the database for a set of scores. This communication is two way, as it involves the Requestor connected to the Providers database and executing SQL. The results of the SQL are then returned to the Requestor for updating to scoreboard. This represents a simple request-response communication. Therefore the second Web Services test case is: “a request-response communication, where the response contains a payload of application data” 3. Check/Poll and Response/Update – The ongoing condition where the JSB polls the server to check for updates and the server responds by making available either a “NoNewScore” string or a set of updated scores. This is the same condition as the “Update by Polling” test case, except responses are mixed containing notifications of “nonewdata” and a payload of application data. “repeated request-response communication, where most responses are of a small payload and fewer responses containing a payload of application data” 4. Collect and Update – Very similar to Update by Polling, except this process is repeated every time a new score arrives and not only on JSB start up. It is questionable whether this communication needs to occur with the overhead of Web Services implementation. DB2 8 provides functionality to translate database structures and data directly into XML. The result may be that this retrieval of data may need only to take this XML document and post it to the CubbyHole. When the client connects, the XML is packaged up in a SOAP message format. However for the purposes of completeness the test case can be defined as a: “repeated request-response communication where all responses contain a payload of application data” 5. Terminate – The termination of the JSB Client involves a one way notification. The message simply contains the string “bye”, which causes the connection to terminate and the corresponding Connection instance to be destroyed and removed from the thread list by the “Vulture” class. The interaction can thus be defined as: “A single message notification (push)” However test case 5 is actually, in practise, the same as test case 1 and so has been The four defined tests form the high level overview the test cases. Components that represent these interactions will be written in Java and tested. The recommendation of whether Web Services in current form are suitable for JSB implementation will be made based on the results of these tests. The implications of the results for other real time applications will also be discussed. Having defined the JSB interaction tests it is worthwhile mentioning the limits of the round trip times considered acceptable for the JSB. A nominal update time of approximately one second for a scoreboard running under normal conditions is expected. Nominal conditions reflect a scoreboard already running having polled the server on initial connection and now receiving regular updates. The servers providing updates are under normal stress and have sufficient system resource to serve 37
  • Michael Wong 151220 connected clients without backlogs forming or performance suffering. A maximum response time of 3 seconds has been highlighted as the acceptable response time when the JSB is being stressed by heavy load in terms of a high number of connected clients and a high frequency of new updates [appendix a]. 38
  • Michael Wong 151220 2.6 Benchmarking Web Services In addition to testing JSB interactions as Web Services it is also useful to perform tests to benchmark the performance of Web Services. The purposes of this is to attempt to generate data which can be used to model and estimate the performance of other Web Service applications. The Internet Engineering Task Force (IETF) hosts a working group dedicated to Benchmarking Methodology [1] [2]. Although the focus of the Benchmarking Working Group (BWMG) [2] is the performance of internetworking technologies, such as IP, Ethernet etc. the principles for benchmarking remain the same. These principles have been extracted from a review of the groups Internet drafts and form the framework of the benchmarking methodology to be carried out in this project. “the scope of the BMWG is limited to technology characterization using simulated stimuli in a laboratory environment.” [2] The BMWG scope of testing is limited to an isolated laboratory environment. Similarly, this project does not attempt to simulate a live environment. Test conditions are also carefully outlined in order to ensure fair testing and if necessary, reproduction of results [3]. These issues are noted here and addressed further in Section 3: Design, where network topology, software, operating systems and hardware and testing procedures are discussed. The BMWG also attempts to produce results that are not vendor specific. This translates to conducting test cases over the three vendor platforms as discussed before. The BMWG also defines carefully the test data and cases to be implemented. The work of the BMWG usually results in two products. First is a document of definitions and concepts and secondly a document containing the actual benchmarking methodology. The second document is equivalent to the areas discussed in section 3: Design. In summary the BMWG defines in detail: • Concepts and definitions • Test environment • Test data • Test cases Concepts and definitions are addressed within this section – Section 2: Review whereas details regarding the Test environment, data and test cases are discussed in depth in Section 3: Design. It is an aim of this project to produce a set of results from benchmarking that will serve as a point of reference for analysing the JSB interaction results. To benchmark Web Services, primitive interactions delivering payloads of primitive data will be modelled. The data types that will be benchmarked include: • Byte • Char • Double • Float • Integer (primitive – not class) • Long • Short • String • Custom Objects It is acknowledged that String and Custom Objects are not primitive data types, but have been included as Strings and Custom Objects are both returned by the JSB [4]. It is likely that other Web Service applications will also return instances of these data types and so have been included in the set of benchmarking tests. 39
  • Michael Wong 151220 These test cases will be performed on a request-response basis. This will form the testing of returning primitive results. The provider will simply return a primitive or a String object to the requestor - a synchronous Simple RPC call [5]. In addition, test cases where a Custom Object containing different quantities of the data types will also be tested. So for example, an RPC call to the service provider instantiates another object containing primitive data types or objects for return to the requestor. This represents an example of a Complex RPC call, where the message exchange incorporates additional interactions as well as between the two points of provider and requestor. 40
  • Michael Wong 151220 3 Design Based on the analysis of the literature and existing systems discussed in the review section, a suitable design for test cases can be developed. This section documents the design decisions and key issues and offers a final view of the test cases with respect to Section 2: Review. The design methodology used is the evolutionary prototyping model. This is because the author has no previous experience in writing web services so the iterative process of developing a prototype and refining it into a final test case as well as redefining test cases throughout development allows the author to incorporate knowledge gained during development into previous stages. An iterative approach also allows hypothesis to be made and tested throughout development, allowing the developer freedom to expand where necessary. 41
  • Michael Wong 151220 3.1 Time stamping - Code Insertion In section 2: Review, Quality of Service – Performance and Testing, the metric of round trip time was defined as being: “[the] time between sending a request and receiving a response” [1] It was also noted that for the purposes of this study, the round trip time should also include processing time of data at both requestor and provider ends. This would ensure that the measurement of the round trip time would not merely be a metric of network operations but also of the overhead imposed by SOAP processing, application server handling and processing of application logic. This would provide a more complete view of processing required for Web Services transactions. In order to calculate the round trip time two elements are necessary: 1. Implementation of test cases as defined in section 3.2: Detailed analysis of test case scenarios. 2. Insertion of code to perform logging and time stamping at critical points in execution. This particular sub-section of design examines at which points logging should be inserted. Application Server Client Application Figure 6 : RPC Architecture with App Server [2] Figure 6 has been adapted from the W3C Web Services Architecture Usage Scenarios document. It documents the architecture of the use of Web Services with RPC. In summary it shows the path that the request travels through. Through the Web Services stack, from the requestor application the request arrives at the SOAP Engine (SOAP Processor) and is then passed through the underlying protocol e.g. HTTP and through the network. Arriving at the provider the message is passed back through the stack, via the SOAP processor up to the application where the SOAP Body containing the RPC is processed by application logic. If defined a response can then be formulated and sent 42
  • Michael Wong 151220 back through the protocol stack to the requestor through the same mechanism as the request was sent. This is discussed in section 2.1.2: SOAP, WSDL and UDDI - SOAP. The diagram has been amended to include also the entry points of the application server hosting the application, and the client requesting and receiving the response of the RPC. In order to ensure that correct measurements are taken it is vital to understand where time stamping code should be inserted. Generally speaking the time stamping code should be inserted within the client and application as highlighted in red. However, start points, intermediate points and end points of logging also need to be defined for each of the test case scenarios. This is discussed further in the next subsection. 43
  • Michael Wong 151220 3.2 Detailed Analysis of Test Case Scenarios This section is written with reference to the high level test cases defined in section 2: Review, Java Scoreboard Interaction Analysis and Benchmarking Web Services. Here the high level test cases will be discussed in further detail such that code may be implemented from the resulting design. Java Scoreboard Tests Test case 1: “a single one way message request”. Requestor:Client Provider:Service Application SOAP Runtime network SOAP Runtime Application (start-point) (endpoint) Figure 7 : JSB Test Case 1 In this scenario, a requestor sends a one-way message to the provider. The payload of the message will be a simple RPC call, the response - nothing. Therefore the start point for measurement will be the entry point of the request procedure, just before the request is generated and passed to the soap engine. This fulfils the requirement to include Web Services processing such as SOAP message preparation within the time stamp. The receipt of the request in a real application such as the JSB would then initiate application logic to fulfil the request. Generally speaking the processing time of the server side application may vary enormously. Therefore the test case should terminate as soon as the application the service provider is representing has received the request. The diagram illustrates the described concepts, where the start point is coloured green; right at the beginning of the execution of the Requestor. The end point is coloured red; immediately after the request has been received. Test case 2: “a request-response communication, where the response contains a payload of application data” network Requestor:Client Provider:Service Application SOAP Runtime SOAP Runtime Application (start-point) (endpoint) network WritetoT ext Document Figure 8 : JSB Test Case 2 This scenario begins in the same manner as test case 1. Where the start point is the entry into the requestors procedure for sending a request to the provider. However, where as test case 1 terminates with the receipt of the request, test case 2 continues by processing a response. In this case the response will contain a payload of data. Defining exactly how the payload of data should be constructed is an important consideration in trying to accurately simulate the JSBs’ operation. This is discussed further in section 3.6 – Designing Test Data. The response formed with a payload of data similar to JSB updates will be packaged and sent as a response. Upon receipt the client will decompose the XML document and output the application data a text document. This simulates the output of the application data from the service to another application such as a browser or another back end system for processing. Once this is complete another time stamp will be taken. This constitutes one test cycle. 44
  • Michael Wong 151220 Test case 3: “repeated request-response communication, where most responses are of a small payload notification and fewer responses contain a large payload of application data” network Requestor:Client Provider:Service Application SOAP Runtime SOAP Runtime Application (start-point) (endpoint) network repeat Writetotext document Figure 9 : JSB Test Case 3 Test case 3 builds on test case 2, in the sense that it is a request-response interaction. It differs in that most responses do not contain a full payload of application data, but a mixture of responses. The responses are predominantly “nonewdata” messages, telling the requestor that there are no new updates available and occasionally a scoreboard update, which delivers a payload of application data containing scores and statistics. An important issue is how to accurately recreate the proportion the number of responses that contain application data to the number of responses that contain “nonewdata” messages. Based on the considerations noted in section 3.4 - Determining Periodicity of JSB application data, the frequency of updates to the Java Scoreboard is one per second, or every 20th poll from the requestor. The same test data as defined within test case 2 will be used. With the same start and end points as this test case is similar in operation and structure as test case 2. In the same manner as test case 2 the end of one cycle is determined by the output of the returned payload, notification or scoreboard data to a text file. Test case 4: “repeated request-response communication where all responses contain a payload of application data” network Requestor:Client Provider:Service Application SOAP Runtime SOAP Runtime Application (start-point) (endpoint) network repeat Writetotext document Figure 10 : JSB Test Case 4 This test case bears a very close resemblance to test case 2. The difference is that this test case runs repeatedly, rather than being a ‘run once’ test. Test case 4 differs from test case 3 in that all responses contain application data. Based on the discussion in section 3.4 - Determining Periodicity of JSB application data, this test case will run once every second to simulate the ongoing arrival of new scores into the database at a busy period during Wimbledon. Like test case 2 and 3 the start point is just before the client makes the RPC request and the end point is after the payload has been output to a text document. 45
  • Michael Wong 151220 3.3 Benchmarking Test Cases The benchmarking tests defined in the review section fall into two categories; Simple RPC and Complex RPC [3]. Simple RPC represents the simple remote method call to the provider class that directly returns a primitive. Simple RPC constitutes the first category test and are diagrammatically represented by Figure 11 . Request Requestor - Prov ider - Client Class Serv er Class Primitiv e Write to f ile Figure 11 : Benchmarking Test Case Model - Simple RPC Complex RPC refers to a more complex interaction. Here the requestor makes a call to the provider class, which in turn calls instantiates another class. The newly instantiated class is passed back to the client, thus to providing the requested data. Request Requestor - Prov ider - Client Class Serv er Class DataObject Write to f ile DataClass Figure 12 : Benchmarking Test Case Model - Complex RPC Much like test case 2, the returned data in the benchmarking test cases will be written to file before the end time stamp is recorded. This simulates the operation of data being passed to another application and thus the final step in the requestor class’ responsibility. The Simple RPC test case will be implemented for test cases returning the following data types. • Byte • Char • Double • Float • Integer (primitive – not class) • Long • Short • String Each piece of data will be set to its maximum value (apart from String). This is explained section 3.6 – Defining Test Data. Complex RPC will be implemented for objects returning 2, 5 and 10 primitives. It is intended that for each Simple RPC test, a corresponding Complex RPC test will also be implemented. 46
  • Michael Wong 151220 3.4 Determining Periodicity of JSB application data Test cases 3 and 4 require that an estimate be made in order to define at what intervals a response containing a payload of application data should be sent. This is named ‘determining periodicity’ as the test case shall implement a uniform set of occurrences. It shall not attempt to model any apparent randomness and fluctuations in the intervals that may be observed in real life, when new scores are may be broadcasted in a non-uniform manner. In this sense, the test case is artificial, but nonetheless represents the characteristic of different responses to the same stimulus over time. The proposed system for choosing the periodicity is covered in the following steps: The overriding assumption is the worst-case scenario, in terms of stress placed on technology and processes. This implies that the number of new scores arriving into the database that require processing is at its highest expected level. If the results of the test cases suggest that the technology can run within the acceptable limits during the worst- case scenario, then there is evidence to suggest that the technology can support a trial implementation of the application. 1. Take the average men’s and ladies’ point duration, which at Wimbledon are 4 and 6 seconds respectively. [4] 2. Take the busiest period in terms of tennis being played; the maximum number of courts with real time statistic being recorded. There are six courts at Wimbledon that have real time data entry, Center Court, Court 1, Courts 2 and 3, Court 14 and Court 18. Therefore, the assumption is that all six courts are in play. 3. Given that the average length of point duration is given to the nearest second, assume that data entry also completes on the nearest second. 4. If all six courts begin play at t = 0 seconds, where t is time, and it is assumed that it is only men on court, updates for all six courts arrive into the database every 4 seconds. As the “thin” connection requests an update every 50ms, the generation of a response containing score updates should occur shortly after 4 seconds. 5. Assuming the same circumstance but for all ladies’ matches where scores arrive on average at the 6 second interval, the result is the same; updates to connected clients at the 6 second mark. However, where the smallest time interval for new score updates is to the nearest second, an update every second is considered as the worst case scenario. This reflects a situation where all courts commence play one second after each other. 6. Regardless of whether there are 6 updates at a given interval or 1, their will only be one update sent to either the client or retrieved the database, which will still contain a full set of scores. 7. Therefore if the requestor sends requests every 50 ms and the relationship between requests and responses is one to one, for every 19 requests sent only 1 response contains a payload of application data. The described process has attempted to simulate the operation of the JSB during periods of greatest load. It is acknowledged that there are shortcomings to this method. The most fundamental flaw is the assumption that updates will occur on the second. It is probable that this is not the case and that results may arrive at staggered intervals within a second. However, in support of this system, it does allow a relatively efficient, predetermined manner of implementing the test case. Efficient, because calculation of when application data payloads should be delivered is reduced to a counter function. The alternative would be to factor in some degree of randomness to simulate more realistically the intervals of new scores being updated. This would be useful for further research but separating the effects of fluctuating load on the service and response times would be difficult without first addressing each issue independently. A critique of methods is offered in Section 5: Evaluation. 47
  • Michael Wong 151220 3.5 Implementing Logging and Timestamping In conducting time stamping it is vital to minimize the impact of the code on the performance of the test case. Otherwise results will be skewed and be poor indicators of performance. In an effort to reduce the impact of time stamping code, the following steps will be taken when implementing code. 1. Minimal data recorded of log entry 2. Writing to memory during run time of test cases 3. Writing information recorded to disk after test case has completed 4. Use simple loops and math functions Minimal data recorded for each log entry As test cases will be conducted separately from each other, information recorded needs only to include the time and a number identifying the cycle of the time stamp with the sequence of a given test case. These two pieces of information will allow the start points and end points of the logging to be successfully paired up and then for the round trip time to be calculated. Requestor Log Provider Log TC1) StartPoint.txt EndPoint.txt 1 12:00:00.05 1 – 12:00:00.23 StartPoint.txt EndPoint.txt TC4) 1 12:00:00.05 1 12:00:02.01 Figure 13 : Example Log Files Figure 13 shows examples of the Requestor Log and the Provider Log. The first case represents a mock up of how the log file may appear for test case one, where entries are made at both requestor and provider ends. The second case represents a mock up of how the log file may appear for test case two, where only the requestor makes log entries. Writing to memory during run time Writing to memory rather than to disk for each log entry will reduce the performance overhead. Access times for RAM vary between 10 – 150 nanoseconds whereas access times for disk drives, between 9 to 15 milliseconds [5]. Given that test case 3 may send requests up to 20 times in one second, 20 disk writes would result in at least 300 milliseconds being spent on disk accessing alone, introducing a logging overhead of 30%. This calculation does not include write back times and potential fluctuations, only access times and therefore this overhead could potentially be much larger. Writing to memory presents a much more suitable option where during run time logs are maintained in a vector. When the test case terminates, the results can then be written to a file for analysis. Simple loops and simple maths functions Complex mathematical functions or attempts to introduce elements of randomness will be avoided. The design of the test cases has intentionally removed the need for randomisation and should require only the use simple repetition and counters to implement test procedures. 48
  • Michael Wong 151220 3.5 Timing Issues In order to calculate accurately the duration of a round trip time, it is necessary that the system clocks on requestor and client be synchronised. If the clocks are not synchronised then the calculated round trip time will not reflect the actual response time. A certain degree of inaccuracy is accepted and has been set to within the limits of 50 ms. That is, the system time of the host of the service provider may vary by up to +25 or –25 ms of the service requestor. This value has been calculated as a result of communication from Alex Phillips, WIS Producer, where the average expected round trip time of the Java Scoreboard when obtaining updates should be less than 1 second and up to a maximum of 3 seconds during periods of high activity [Appendix A]. As requestors continually poll the JSB Server every 50 ms an error margin of half the poll interval has been deemed small enough to be imperceptible to the user but also large enough to account for any potential difficulties in synchronising system clocks. Software has been obtained that shall be used to synchronise clocks on the host and client. Softros provide a Network Time System package, which is to be used on a 30 day trial basis. The accuracy of the Softros Network time System depends on the network latency, but communication with Softros suggests that the discrepancy between the server and client in the test environment should be less than 35 milliseconds [Appendix B]. Before each test is conducted the client will be run to ensure the system clocks upon both client and host are synchronized [6]. Requestors poll the service on a 50 ms basis and the margin for discrepancy between host and client timing is 25 ms. These two factors are the finest granularities of measurement within testing, therefore the finest granularity of time stamping required is in milliseconds. 49
  • Michael Wong 151220 3.6 Defining Test Data To preserve as much of the design of the JSB within the test cases, it is important that test data is also representative of the current JSB implementation. The current implementation of the JSB delivers scoreboard updates by sending a string of statistics delimited by # and | symbols. For the purposes of testing, an equivalent XML representation of the JSB string score update will need to be produced. This can be achieved by defining an Object called “ScoreUpdate” at the application (test case) level, which contains data typical of a JSB String Update. This object will be populated with fields that resemble the current update string, which is formed from a table of current scores from the db2 database. When a request is made the class hosting the RPC will return an instance of the ScoreUpdate object, which as it propagates through the Web Services stack, is translated into XML by the SOAP engine, for interpretation back into a Java object at the requestor end. This principle also applies to the Benchmarking test cases where multiple primitive data types are to be returned. An object will be defined at the provider end that contains multiple instances of the data type to be tested. The request to the provider is responded to by returning an instance object containing the primitive data types. Sqltype sqllen sqlname.data sqlname.length -------------------- ------ ------------------------------ -------------- 448 VARCHAR 8 EVENT_ID 8 452 CHARACTER 1 ROUND 1 501 SMALLINT 2 COURT_ID 8 496 INTEGER 4 MATCH_ID 8 Figure 14 : Sample from Wimblive ‘Current’ view Figure 14 shows a sample of the data contained within the ‘current’ view of the db2 database that feeds the JSB. The existing non Web Services JSB Implementation selects all the data contained in this view and formats it for distribution. For each of the data fields defined in this view, a value in the “ScoreObject” class will be defined. For example, EVENT_ID is effectively a string of 8 characters. Its ScoreObject equivalent will be a string of 8 characters. The sqllen field defines the maximum length of the field, to examine the performance of the Web Service, the corresponding variable in ScoreObject will be set to the maximum length as defined by sqlname.length. For a complete listing of the Current view field see Appendix B. For benchmarking data types returned, the maximum value will be set. This includes the Simple RPC return of the primitive and the Complex RPC return of an object containing multiple primitives. By returning primitive results of maximum value, the response times of a Web Service application can be modelled as a worst-case scenario. byte largestByte = Byte.MAX_VALUE; short largestShort = Short.MAX_VALUE; int largestInteger = Integer.MAX_VALUE; long largestLong = Long.MAX_VALUE; Figure 15 : Setting primitive max values Figure 15 demonstrates the setting of primitive values to maximum values. A list of the values of the maximum values for each primitive data type can be found here [7]. 50
  • Michael Wong 151220 3.7 Test Environment With the available hardware and software the following test environment has been set up. Server The Server hosting the development kits is an IBM PC 300 PL and possesses the following hardware: • CPU/L2 Cache - P3 733MHZ/256KB • Memory - 256MB RAM (RIMM) • 20.4GB HDD IDE The following software has been installed: • Windows 2000 Professional Service Pack 3 • WSDK v5.0.1 • JWSDP v1.2 with Jakarta Tomcat 5.0 • AXIS 1.0 with Jakarta Tomcat 4.1.24 • VNC for Windows for remote desktop access [9] • Sun Java 1.4.1 SE SDK [10] • Softros Network Time Server • Eclipse M3.0 Release [12] No additional software aside from the software installed as standard by Windows 2000 and the listed software above. A more complete set of technical specifications are available from IBM.com [8]: Client The client is an IBM Thinkpad 600x and possesses the following hardware: • CPU/Cache – P3 500MHZ/256KB • Memory – 384 RAM • 12 GB HDD The following software has been installed: • Windows 2000 Service Pack 3 • Sun Java 1.4.1 SE SDK [10] • Softros Network Time Client [6] The client is also used as a workstation and therefore has many other applications installed. However during testing these will not be running. Unnecessary background services will also be turned off so that both client and server are running skeleton services only. See Appendix D for a complete list of services running during testing. Further technical specifications of the 600x are available from IBM.com [11] Network A small test network has been set up comprising of only the server and the client. They are connected through a Fast Ethernet 10/100mb switch. No other clients are connected to the switch so only traffic between client and server is generated. As a result very low latencies of consistently below 32ms are achieved. 51
  • Michael Wong 151220 3.8 Testing Procedures In order to ensure fair testing it a set of procedures have been designed for use during testing. These will be followed strictly in order to ensure as far as possible that every test case is conducted under the same conditions. The following set of procedures should be followed before commencing testing: • Shutdown all non essential background services [Appendix C] • Shutdown all non essential applications • Shutdown all other Web Services except the running test case to be executed • Synchronise server and client clocks • Restart the application server After this test case can be tested. After each test case has completed the application server will be restarted and the clocks synchronised again before either retesting or a new test case is loaded. In the event a new test case is loaded the previous test case must be disabled. 52
  • Michael Wong 151220 4 Implementation The design detailed in Section 3 has been implemented. This section documents the challenges encountered during the implementation stage and their resolutions. 53
  • Michael Wong 151220 4.1 Introduction Due to time restrictions not all test cases were implemented. Only a partial number of test cases were implemented although these were selected specifically to test hypothesis that were developed as results were being collected. Test cases were tested first locally on the server and then the requestor files were copied to the client machine when testing commenced. As mentioned in Section 3: design, test cases were developed using the Eclipse IDE. 54
  • Michael Wong 151220 4.2 JSB Interaction Test Cases The JSB interaction test cases were implemented first. This section discusses some of the challenges experienced and how they were solved. 4.2.1 Test Case 1: One Way - “a single one way message request” The initial design of the One Way test case recorded timestamps at both the server and client ends of the interaction. It was intended that the start points and end points of the interaction would be recorded on the client and server respectively. However, difficulties were encountered when calling the necessary method to write the end point timestamps to the server’s disk. Initially two methods were implemented on the One Way server. The first method makeRequest() made a log entry, as this was the point of entry for the remote method call made by the requestor. Having made the log entry a second method was invoked by the requestor - writeResultsToDisk() which was supposed to write the log entry to the servers disk. However, the call invoked by the requestor was interpreted as a write to the client’s disk. As a result security exceptions were thrown, the results were not written to disk and the test case halted. In order to rectify this situation two different approaches were considered: 1. The implementation of a custom security manager to grant the provider access privileges to write to the client disk [1] 2. Passing the vector of results back to the client for writing to disk The 2nd option was chosen. This did not impact the results of benchmarking as the timestamps had already been recorded before the vector was passed to the client. Furthermore, the implementation was much more straightforward than defining a new security manager. All that was required was to implement a new remote method to return the Vector of timestamps. This also made collecting results simpler as timestamps were written to the same location within different files on the client. 55
  • Michael Wong 151220 4.2.2 Test Case 2: Update by Polling - “a request-response communication, where the response contains a payload of application data” The primary difficulty encountered in this test case was in defining the payload of data. During the development of the test case trial runs resulted in the generation of exception(500) Internal Server Errors. The path of execution was traced by inserting “System.out.println(“string”)” throughout the application. It was discovered that the error occurred when the test case was trying to write the received score payload data to file. Checking the server logs see [appendix e] for a full trace of the error, this particular line seemed to reveal the cause of the internal server error. java.io.IOException: java.io.IOException: No serializer found for class java.lang.Character in registry org.apache.axis.encoding.TypeMappingImpl@217cbd5c Figure 13 : Stack trace sample - No Serializer for java.lang.Character Research on Web Services and AXIS forums revealed that AXIS 1.0 does not support the character data type and hence possesses no serializers [2]. This is an example of a shortcoming of AXIS 1.0. From a general view of implementing Web services, applications that specifically must use ‘char’ will have to recast the value as a string of one character length for transport over SOAP, and then recast the value back to char on the receiving end. In the case of the JSB interaction tests the author was afforded a degree of flexibility as the results in the final application are to be drawn to a browser and therefore not required to be in ‘char’ form for additional processing purposes. The values in the test payload defined by the ‘current’ view in the Wimblive database as ‘char’ were replaced by strings of one character length [appendix b]. The test case then operated correctly. In turn this meant that the benchmarking test designed to return the primitive data type ‘char’ could not be implemented. 56
  • Michael Wong 151220 4.2.3 Test Case 3: Check/Poll and Response/Update - “repeated request- response communication, where most responses are of a small payload and fewer responses containing a payload of application data” Not so much an implementation problem, but a concern related to results. Examining the preliminary results, it was discovered that the first request made by this test case took a lot longer to fulfil than the remaining requests. It was considered that the test case might be returning the same instance of the ScoreUpdate class, which was why the first connection took much longer. That is to say, the first connection to the test case 4 provider created an instance of the ScoreUpdate class that was then processed into XML and SOAP for transport. It was hypothesised that the same instance was being returned by each call made by the requestor, which was why the response times were so low. To test whether or not this was the case another instance of the ScoreUpdate class was explicitly created by passing slightly different values to the constructor method mid way through the operation of the test case. The 2nd version of the ScoreUpdate object was then passed back to the client and the results examined to see if returning the new instance of the ScoreUpdate class caused the response time to peak to the same values as the initial connection. The results of this are further discussed in Section 5: Evaluation. 57
  • Michael Wong 151220 4.3 Benchmarking Test Cases 4.3.1 Returning Primitives - Simple RPC As mentioned in section 4.2, AXIS 1.0 does not support the ‘char’ datatype and so the return of the primitive test case ‘char’ was not implemented. Aside from this there were no problems encountered when deploying a simple RPC web service returning each of the listed primitives [Section 3.3]. 58
  • Michael Wong 151220 4.3.2 Returning Multiple Primitives – Complex RPC Array Deserialisation Issues Section 3.3 – Figure 12 illustrates the design of the test cases returning multiple primitive data types. The reader may notice that creating an object that contains the primitive data types seems wasteful in the sense that an array to contain the primitives could also be used. This would present a lower overhead associated with processing an object complete with getters and setters. A primary objective in benchmarking and testing of Web Services was the minimisation of overhead. The reason for this apparent contradiction is that when trying to implement a test case where an array of strings was to be returned, the following error was encountered: No Deserializer found to deserialize ArrayOf_xsd_string Having searched the forums for details of how to perhaps register a serializer for an array of strings numerous articles were discovered where arrays of complex data types (non- primitives) were proving difficult to implement. It appears as though an Apache SOAP client interacting with an AXIS server seems unable to register a deserializer for ArrayOf_xsd_string [3]. In light of this the option to return Strings would either have to be discounted or adapted. The latter option was chosen and in the interests of standardising the tests, the remainder of the test cases returning multiple instances of data types also adopted the same changes - returning the data types within a java object. Time Restrictions and Reduced Test Set Time restrictions also meant that not a complete compliment of complex RPC tests could be completed. Only a selection of test cases were implemented which included byte, long and string with multiple instances. The string test case was also modified at the last moment to test a theory regarding the response times of web services. Further details can be found in Section 5: Evaluation and analysis but the problem is outlined here. The string test case was the last to be implemented. As previous results were collected they were plotted in graph format. The author observed the trends and response times and it appeared as though increasing the payload of benchmarking test cases had little impact upon response times. Each string with the multiple string payload test case was then dramatically increased. The string length for the simple RPC test case was of 8 characters in length. For the complex test case this was increased dramatically and an 88-character string replaced the 8-character string. A complete list of test data can be found in the appendices. The impact of the dramatic increase in payload data was then tested, the results of which are documented in Section 6: Evaluation. Regrettably, also due to time restrictions, test cases could only be carried out upon IBM WSDK 5.0.1. Test cases could not be carried out upon Suns JWSDP or a Apache AXIS installation. However the designs may still be used to complete and extend this work as is discussed in Section 6: Evaluation. The consequences of the changes that were made as a result of time restrictions and array deserialisation issues upon the overall validity of testing are discussed in Section 5: Evaluation and analysis. 59
  • Michael Wong 151220 4.3 Deploying Test Cases Once the test cases had been written and tested locally on the server the requestor classes needed to be moved to the client in order to complete testing. A few minor issues were encountered in conducting the testing but were readily remedied. 4.3.1 Batch Scripts and Class paths When the requestor was first deployed to the client, class paths had to be set up in order to run the client. This included the use of a batch script, a sample of which is included below [appendix f]. @echo off set libpath=C:WSDK_v5appserverlib set requestorpath=C:WSDK_v5appscomplexRPC4requestorsrc set SEIpath=C:WSDK_v5appscomplexRPC4requestorsrcclient-sidelpcrrhighpayload complexrpcserver java –classpath %libpath%j2ee.jar;%libpath%axis.jar;…. Figure 14 : Sample Batch Script for Running Test Case Requestors The requestor requires paths to be set informing the client class where to locate the library files for the application server and the root of where the requestor files were copied to. It also requires the path to be set for where the service endpoint interface classes (SEI classes) were kept. The SEI classes are generated when using the WSDK Bean2WebService tool [4]. The Bean2WebService tool which takes a java class as input and creates an EAR file containing the original class packaged with additional files automatically generated that are also required for accessing the class as a web service. The SEI classes attempt to standardise deployment of Web services in the J2EE environment. They define, at an application level, the exposed methods and the data to be exchanged and are essential a java mapping from WSDL [5]. 4.3.2 Connecting the requestor to the provider Once the class paths had been set up the client class then ran, only to be unable to connect to the server. The application was definitely running, and the web service was deployed into the application server. Both client and server were able to ping each other and also share files across the network, and the server could be telnet into from the client on the Web service port ‘6080’. However examining the error messages the requestor was definitely unable to contact the provider. C:WSDK_v5appscomplexRPC4requestorsrclpcrrhighpayloadcomplexrpcclient>RR HighPayloadClient AxisFault faultCode: {http://xml.apache.org/axis/}Server.userException faultString: java.net.ConnectException: Connection refused: no further information [appendix g] Figure 15 : Sample Stack Trace – Connection refused In an attempt to rectify the issue the construction of a dynamically binding client was attempted. However in attempting to run the dynamically binding client, the following error message was produced. SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize. Figure 16 : Sample Stack Trace – SAXException: Simple Deserializer This error message prompted another search through forums when an article was discovered that suggested downloading the new AXIS build and updating the configuration of the server would help [6]. However the file suggested for reconfiguration - server- config.wsdd was not found to be present anywhere on the server machine. Although this avenue of approach seemed unfruitful it did provide insight into the issue. Referring back 60
  • Michael Wong 151220 to the SEI class files mentioned previously it was thought that perhaps somewhere within these files was a configuration setting that could be altered that would rectify the problem. It was discovered that within the <server_class_name>_SEIServiceLocator.java file, that a variable containing the URI of the service was produced by the Bean2WebService tool. The Bean2WebService tool had set the IP address to ‘local’ host. This was changed to the IP address of the server, recompiled and redistributed to the client thus solving the issue. In retrospect if the dynamic client had run correctly it wouldn’t have been able to resolve the server without updating the respective WSDL file. The SEIServiceLocator files and WSDL file are similar in content and it was discovered that like the SEIServiceLocator file, the WSDL service address was also generated as localhost rather than the IP address of the host machine. // Use to get a proxy class for OneWay private final java.lang.String OneWay_address = "http://localhost:6080/SimpleRPC1/services/OneWay"; // Use to get a proxy class for OneWay private final java.lang.String OneWay_address = "http://10.10.0.1:6080/SimpleRPC1/services/OneWay"; This concludes the Section 4: Implementation. Full code listings of the test cases may be found in the appendices. 61
  • Michael Wong 151220 5 Analysis of Results and Evaluation In this section the results collected from JSB interaction tests and benchmarking tests will be analysed. Analysis will occur with particular consideration to whether the results indicate that Web services are capable of performing sufficiently well for real time applications. Following the analysis of results, a critique on the techniques used and the impact of ad hoc modifications to the test cases is offered. 62
  • Michael Wong 151220 5.1 Benchmarking Results 5.1.1 Simple RPC Primitive Data Type Results For each of the benchmarking trials, three test runs were completed, within each test run the test case was executed 10 times. At the end of each test run the application server was restarted. The mean average of each test sequence was then taken and plotted in graph form. Shown below are the mean average response times for the round trip time returns of 3 of the data types tested; byte, long and string. Request Reponse Tim e - Average from 3 trials for byte.Max_Value 2.500 2.000 Time (seconds) 1.500 Average Round Trip Time 1.000 0.500 0.000 1 2 3 4 5 6 7 8 9 10 Test Sequence Figure 17 : Request Response Time Averages – byte.Max_value Request Reponse Tim e - Average from 3 trials for Long.Max_Value 2.5 2 Time (seconds) 1.5 Average Round Trip Time 1 0.5 0 1 2 3 4 5 6 7 8 9 10 Test sequence Figure 18 : Request Response Time Averages – Long.Max_value 63
  • Michael Wong 151220 Request Reponse Tim e - Average from 3 trials for 8 Character string 2.500 2.000 Time (seconds) 1.500 Average Round Trip Time 1.000 0.500 0.000 1 2 3 4 5 6 7 8 9 10 Test Sequence Figure 19 : Request Response Time Averages – 8 Character String These three graphs represent three different sizes of data types that are being returned. A byte length integer is represented as 8 bits, a long integer by 64 bits and a string is represented as a java object [1]. These data types encompass the smallest and largest primitive numerical representations and also an object type. By comparing the three different payloads it was thought that differences in response times could best be illustrated. However, upon examining and comparing Figures 17, 18 and 19 it is apparent that response times are very similar. For further analysis it was noted that the first request took substantially longer to fulfil. The analysis of the collected statistics separates the first request from the remaining test cases. Test Case Average first response Standard Deviation time (seconds) Byte.MAX_VALUE 2.256 0.075 Long.MAX_VALUE 2.113 0.172 8 Character String 2.079 0.214 Figure 20 : Average response times – 1st request Figure 20 tabulates the average response times for the first connection. The response time for the request that the test case makes results in a high response time. This then drops to a much lower value (see figure 21). Examining figure 20 there is little difference between the response times for each of the different payloads. Surprisingly, it appears that Byte.MAX_VALUE with the smallest payload actually takes longer to respond than the larger payloads. The value of the standard deviation is to indicate the fluctuations (deviations) of the individual test execution times from the mean average. Observing the standard deviation it appears that the response times of the test cases with larger payloads (long and string) fluctuate more than the byte payload test case. To summarise, the longer average first response time is of Byte.MAX_VALUE test case reconcilable by the larger standard deviations of long and 8 character string test cases. The standard deviation suggests that there is sufficient overlap in initial response times to propose that there is a negligible difference in the response times of the first request made by the Byte, Long and 8 Character String test cases. 64
  • Michael Wong 151220 Test Case Average response time – Standard Deviation ex 1st Req. (seconds) Byte.MAX_VALUE 0.582 0.164 Long.MAX_VALUE 0.542 0.098 8 Character String 0.519 0.062 Figure 21 : Average response times – Excluding 1st request Figure 20 shows the average response times of the 3 test cases but excluding the 1st request, which took substantially longer to fulfil. Again, it appears as though the Byte.MAX_VALUE requests take a lot longer to fulfil than test cases returning larger payloads, such as Long. This contradicts the theory that a larger data type or a java object should take longer to instantiate, marshal for XML transport and transmit across the network than a smaller data type. It is possible to discount the minor fluctuations but to investigate more thoroughly much more test data needs to be collected and possibly a more detailed analysis of the environment and JVM is necessary to determine the exact cause of this unexpected result. This is discussed more in section 5.3: Assessing Methodology. Overlooking the fluctuations and anomalies in returning the byte payload it can be suggested that; the type of primitive transmitted is a minor contributing factor in the overall round trip time of a request-response interaction. Primitive Simple RPC: Mean Round Trip Time (excluding 1st request) 0.590 0.580 0.570 Time (seconds) 0.560 0.550 0.540 Mean Round Trip Time 0.530 (excluding 1st request) 0.520 0.510 0.500 0.490 0.480 le t te g ng t t In or oa rin ub By Lo Sh Fl St Do Data Type Figure 22 : Complete average response times – Excluding 1st request The above graph shows that for all the primitive data types tested and the 8-character string, that the response time should be approximately 0.5 seconds. The largest standard deviation of 0.164 seconds was produced bye the Byte test case. The standard deviation of the quickest responding data type, 8-character string object was found to be 0.062 seconds. Therefore the following conclusion can be drawn. Given the environment as defined in Section 3: design – response times of between 0.4 seconds to 0.74 seconds can be expected from the data types of Byte, Double, Float, Int, Long, Short and 8-character string. In the event that larger data types such as long and double resulted in significantly longer round trip times than a smaller data type such as byte, the author would have suggested that applications returning primitive data types should expect to find lower round trip times than the recorded benchmark. This is because maximum values were used for each 65
  • Michael Wong 151220 of the primitive data type values, which would not always be the case in a real application where lesser values would also be used. However, the most surprising finding is that larger data types have not necessarily meant longer round trip times. In this case to correctly identify the cause of this unexpected result, further study is required and outlined in Section 6: Conclusions. 66
  • Michael Wong 151220 5.1.2 Complex RPC Primitive Payload In section 4.3.2 it was noted that for multiple instances of data types being returned, the string payload was increased dramatically from 8 characters to 88 characters. This is an appropriate place to elaborate upon the motive for modifying the test case. The conclusion drawn from results collected for single primitive data types and a short string was that because the data types were so small in payload, the difference between a long primitive or a byte primitive payload had very little impact on the round trip time of a request. This implies that most of the processing time required for Web services processing and application server handling. The purpose of dramatically increasing the payload of the string test case was to observe whether this would result in a significant increase in response time. As mentioned in section 4.3.2 due to time restrictions, only a limited set of complex test cases was implemented. The complex test cases implemented were – bytes, long and strings. Examining the graphs plotted for the Complex RPC tests, it reveals similar initial findings as the primitive test cases. These graphs are found in the appendices and more insightful graphs are included within this body. The results discussed in the previous section will be compared to the results collected for the complex RPC set of test cases. Complex RPC: 1st Request Mean Round Trip Time 2.550 2.500 Time (seconds) 2.450 2.400 1 Request Mean Averages 2.350 2.300 2.250 2.200 s s 2 s s St s St s s s s ng ng g ng g g te te te rin rin rin By By By lo Lo Lo St 10 2 5 10 5 10 2 5 Test Cases Figure 23 : 1st request mean round trip time for all complex tests Examining figure 22, it appears as though the initial response time is not affected primarily by payload size or even by data type. For example 5 longs take 110ms longer that 10 strings to return. However, it can be observed that the mean average of the initial response time for the Complex RPC test case returning an object is significantly higher, by 10% when compared with the Simple RPC test cases. Mean Average for Simple RPC 1st request Mean Average for Complex RPC 1st request 2.171 s 2.4 s Within the complex RPC test cases there appears to be no visible correlation between data type and data size to response time, suggesting that the primary overhead of the Complex 67
  • Michael Wong 151220 RPC is in the additional cost of interpreting the Java object into XML and the marshalling for SOAP transport rather than the actual difference in quantity in data. Test Case Average response time – Standard Deviation ex 1st Req. (seconds) (Primitive) 0.582 0.164 Byte.MAX_VALUE (Complex) 2 Bytes 0.623 0.075 (Complex) 5 Bytes 0.632 0.137 (Complex) 10 Bytes 0.618 0.082 Figure 24 : Average response times – Bytes Excluding 1st request comparison Test Case Average response time – Standard Deviation ex 1st Req. (seconds) (Primitive) 0.542 0.098 Long.MAX_VALUE (Complex) 2 Long 0.626 0.123 (Complex) 5 Long 0.650 0.098 (Complex) 10 Long 0.626 0.077 Figure 25 : Average response times – Long Excluding 1st request comparison Test Case Average response time – Standard Deviation ex 1st Req. (seconds) (Primitive) 8 Char String 0.519 0.062 (Complex) 2 88-Char 0.658 0.081 Strings (Complex) 5 88-Char 0.642 0.085 Strings (Complex) 10 88-Char 0.649 0.094 Strings Figure 26 : Average response times – String Excluding 1st request comparison In examining the tabular format of the average response times for each of the test cases, the results are closer to the expectations of the author. An increase in response time was expected as the overheads associated with instantiating a new object, and necessary processing to marshal an entire object into XML and SOAP are much larger than when returning a raw data type. This increase is observed between the primitive test case and the first complex test case. Byte shows a 7% increase in, Long a 15% increase and a 26.7% increase over String in average response time, excluding the initial connection (highlighted in bold). However, as before, with the primitive test cases increasing the size of the payload for the mechanism of data transport seems to have little influence on the round trip time of a request. This is most evident in figure 24 where the final test case transmits 10 string objects, totalling 880 characters. The average round trip time taken from 27 executions of the 10 88 character string test case is 0.649. The string test case returning 2 strings of 88 characters, totalling 176 characters actually takes marginally longer at 0.658 seconds. The conclusion drawn from this is that the a mechanism of packaging data, whether it is a raw data type being transmitted or whether it is packaged within an object, appears to be the main contribute to round trip times. The much larger payload of the 10 string test case increased the round trip time by only 26 milliseconds when compared with the significantly smaller payload of the (Complex) 2 Bytes test case. Many more results were collected during testing that are not discussed here. However the analysis of the summary statistics has hopefully been sufficient to demonstrate that the content of data is of marginal significance to the overall round trip time. The more significant contributing factor appears to be whether a piece of data is returned directly or whether it is embedded within another object. The significance of the payload has been suggested as marginal up to the value of 10 strings where each of the strings are 88 characters long. However the definition of marginal within the context of real time applications is elastic. The difference of 26 milliseconds in the round trip time between the 10 string payload and the 2 byte payload may be unacceptable for mission critical applications, but for the JSB where in section 2: Review, it was stated that 3 seconds high load response times and nominal operation of 1 sec round trip time were acceptable, the 68
  • Michael Wong 151220 26 milliseconds difference is marginal. The next section discusses the findings of the JSB test cases. 69
  • Michael Wong 151220 5.2 JSB Interaction Results JSB Interaction Test Case Results 4 3.5 One Way - Request 3 Time (seconds) 2.5 RR - High Payload 2 RR - Single Payload 1.5 1 RR - Occasional 0.5 Payload 0 1 2 3 4 5 6 7 8 9 10 11 Test Sequence Figure 27 : JSB Interaction Test Case Results Figure 25 shows the results of the Java Scoreboard test cases. There are a number of unexpected occurrences in this test case which are investigated here. There is an obvious discrepancy between the run once test cases, RR-Single Payload and One Way Request and the repeated test cases High Payload and Occasional Payload. Where as the benchmarking tests suggested that expected response times should be within 0.5 seconds (±0.2 s) the average response time for high payload and occasional payload test cases were 0.1 seconds and 0.09 seconds respectively. Figure 25 shows the first 11 cycles of the 20 test cycle for the High Payload and Occasional Payload classes. It compares this with the averages taken from 11 test executions of the run once test cases. The differences between the run once test cases and repeated test cases for the first connection and also the remainder of the test execution was cause for concern throughout testing. During the execution of test cases, numerous strategies were employed to try and determine the cause of this discrepancy. Firstly the repeated test cases were conducted multiple times. Similar results were yielded where large differences between the run once tests and the repeated tests were observed. An experiment was also conducted to test the hypothesis that the test case was taking such a short time to complete because it was returning the same instance or a cached object rather a new instance of the ScoreUpdate packet. If this was indeed the case then an explicit call to create a different instance should cause a spike in response times. A modified Occasional Payload test case was devised that returned on the 1st call one payload instance called “PayloadA” and on the 10th call returned a different payload instance called “PayloadB”, on the 20th call returned “PayloadA” again. The results are plotted below. 70
  • Michael Wong 151220 M odified Occasional Payload Round Trip Times 1.4 1.2 Time (seconds) 1 0.8 Modified mixed 0.6 payload 0.4 0.2 0 1 3 5 7 9 15 17 11 13 19 Test Sequence Figure 28 : Modified Occasional Payload Round Trip Times Although a small peak was observed at test sequence 10, the same peak is also observed at test case 16, where no payload of data was being returned. Therefore the theory of same instances and caching of objects causing very low response times was discounted. Investigating another lead, the following code was discovered in some lecture slides. nAxis supports scoping service objects three ways: nRequest, the default, will create a new object each time a SOAP request comes in for your service. nApplication will create a singleton shared object to service all requests. nSession will create a new object for each session-enabled client who accesses your service. [2] The above noted settings are contained within the WSDL documents for Web Services developed using AXIS, but the WSDK version of the settings are abstracted out to one of the SEI classes - <servicecname>SoapBindingStub,java where the following line was discovered revealing that the state was being maintained throughout the duration of the session. Thus explaining the significant drop in time from the first request of the client when the session was being establish to subsequent requests when the connection and state was maintained [3]. org.apache.axis.client.Call _call = (org.apache.axis.client.Call) super.service.createCall(); if (super.maintainSessionSet) { _call.setMaintainSession(super.maintainSession); However, despite this, the author of the document is unable to explain why, even if session state is being maintained, that the round trip times for High Payload and Occasional Payload are so low. Either one of two possibilities are true. 1. The very low response times are actually representative of the expected performance of Web Services 2. An error in implementation has caused inaccurate results to be generated In the event that case 1 is true, the conclusion that Web services perform more than sufficiently well to support a real time application such as the JSB can be drawn. Although the Single Payload and One Way request test cases took along time to respond to, One Way request is still within the upper limit of three seconds response time. Single Payload, upon revision would probably not be implemented as a web service, but as it forms part of the server side application which communicates as a Web service, may well return just a standard string of SQL results which could then be marshalled for SOAP transmission in XML format only when distributing the data to requestors. 71
  • Michael Wong 151220 In support of case 1, retesting yielded the same very low values. Modifying the test case also did not impact the performance of the test case. However in support of case 2, referring back to the results generated at the benchmarking phase the implications of results generated appear to differ to results collected for the JSB interactions. The ScoreUpdate instance contains more data than the 2 byte complex RPC test case, also the ScoreUpdate instance delivers data by the same mechanism of complex RPC, but does exhibit the characteristic of a base round trip time of approximately .600 seconds. Without further research the author cannot be more conclusive over the results of repeated test cases, except to suggest that based on estimations made from results collected in the benchmarking tests, a basic response time of around 600 ms is should be expected and that further research is necessary to confirm what the exact cause of the discrepancy between the benchmarking times and the JSB test times are. 72
  • Michael Wong 151220 5.3 Assessing Methodology Here follows a critique of the methods employed for benchmarking and testing in this project. Spread too thinly In retrospect the division of effort into producing test cases that were specifically relevant to the JSB as well as designing benchmarking test cases for more general purposes was to the detriment of collected data. Time spent developing test cases based on the JSB interactions would have been better spent implementing a more complete set of test cases for benchmarking and also investigating the throughput limitations of Web services. Also, more time could have been allocated to investigating the precise impact of different data types on the round trip time. The conclusion drawn from results so far is that the mechanism for transporting data affects round trip times to a greater extent than increasing the payload of data. Obviously this only applies to the test cases implemented, and without further study this conclusion can only be applied to the results collected so far. A more satisfactory conclusion would be to explore the differences in round trip times further, regardless of how apparently marginal the difference may appear to be. This would provide a much more accurate framework for estimating the round trip times. More complete set of test cases A larger set of test cases would have produced a more complete set of results from benchmarking. Test cases that would have been beneficial to include would have been to complete a full set of Complex RPC cases rather than just the three test cases which time permitted. Also it would have been useful to use arrays to return primitive data types despite the fact that arrays of strings seem to currently un-implementable. This would yield results for single instances of primitives returned through the use of simple RPC as well as multiple instances of primitives contained within arrays and finally objects which could also have been tested for other complex data types, for example Vectors, graphics, attachments etc. A more comprehensive set of tests would be more useful for making predictions on the performance of Web services before a study of application specific interactions could have taken place. Consider more factors Although the results produced in this study indicate that the IBM WSDK is suitable for a trial implementation of the Real Time Java Scoreboard there are also new issues to be addressed that this project has encountered. The apparent difficulty of using arrays to contain complex data types is one of these issues and also the lack of support for char in XML Schema Definitions (XSD). Questions also remain as to the exact impact of different data types within the payload upon the round trip time of a test case. The fluctuations observed in the results collected for benchmarking and JSB Interactions were too small for conclusions to be drawn. Determining the precise cause of these fluctuations would require more detailed data collection and analysis regarding the environment, prior to, as well as during run time. However, implementing more tests to determine the exact cause of these fluctuations and whether they are typical of web services or idiosyncratic to the test environment also have implications upon the validity of results. As more metrics are taken to determine the cause of fluctuations, the greater the demand for processor time, memory, OS scheduling etc in order to manage the measurements being taken. The purpose of these measurements would help to determine whether non-Web service related activities were interfering with the results collected. For example, if an OS vital process was being context switched with the provider thread, or if variations in temperature from day to day during testing were having any significant impact on results collected. The sum total of additional tracing, check pointing and system snapshots cause an overhead, skewing results not just by increasing round trip times but also introducing their own element of unpredictability as software for performing additional system checks interacts directly or indirectly with the test case. This is known as the Probe effect or the Heisenberg Uncertainty Principle that simply states: 73
  • Michael Wong 151220 "The more precisely the position is determined, he less precisely the momentum is known" [4] Although deeper collection of results regarding network, OS status and hardware status may provide a more complete picture of the interactions that may be causing fluctuations in the results of testing, the impact of collecting additional results introduces an uncertainty as to the actual round trip time of the Web service in the absence the additional logging. Although there techniques to minimising the probe effect they are beyond the scope of this project and are acknowledged as import factors in continuing further work [5]. 74
  • Michael Wong 151220 Platform independence (not vendor biased) In section 3: Design, the Internet Engineering Task Force Benchmarking Working group (IETF BMWG) documents were used as references to help develop the benchmarking methodology. One of the aspects that the IETF BMWG strives for are non-vendor specific results. It was the initial intention of this project that test cases would be implemented upon three of the major platforms available for Java Web services development. It was hoped that the range of results would provide a foundation for comparison and supply sufficient data as to be able to make an informed decision as to what the most suitable platform for hosting real time web services would be. Given the lack of time this could not be carried out, so although the intention was in the absence of any vendor independent technology to supply results for a variety of vendors, it was not wholly implemented. Timing The issues of platform independence in testing, implementing a complete set of test cases and conducting further analysis are related to time constraints. This project has been constrained in terms of time, partially due to mismanagement of commitments and also workloads from work activities. The author acknowledges that had this project been better managed further work might have been carried out such that this project would have had more complete results. 75
  • Michael Wong 151220 6 Summary, Conclusions and Future 6.1 Success of project Referring back to the problem statement the objective of this project was to: To investigate and determine whether Web Services are a suitable means of packaging and distributing real time data. This was divided into three areas each of which will be tackled independently: 1) To examine and assess the features of Web Services that may make them a suitable means of accessing and exchanging real time data. The architecture and implementation technologies of Web services were discussed. The primary advantages of which were ease of integration and open standards that would allow parties to dynamically bind to a real time service. As a model, Web services suit any interaction between parties unfamiliar with each others systems. As business, research institutions and consumers alike use the Web and are at least initially unfamiliar with each other’s systems, Web services provides an ideal model for exchange of data. However, at this stage it was still unknown as to whether the current implementation technologies of Web Services i.e. SOAP, UDDI and WSDL performed suitably well for real time implementations of web applications. 2) Investigate aspects of Quality of Service, in particular response times when returning a range of data types under different conditions. In investigated response times, a range of test cases were designed and implemented, but executed only under one set of conditions i.e. a single connecting client. Both benchmarking tests and JSB interaction tests were developed and tested. Benchmarking tests encompassed both simple RPC, which returned data types directly to the requestor, and complex RPC, which returned data types embedded within an object. Unfortunately a testing was not completed for complex RPC but findings were included within the project. 3) Analyse the results in order to gain an insight into the suitability of Web Services in delivering real time content. In determining whether Web services were suitable for real time applications benchmarking results were considered first and then JSB interaction results compared to the benchmarking results. Benchmarking tests showed that regardless of whether the payload of a response was a single byte primitive or 800+ characters the response times should be expected to be within ± 0.2 seconds of 0.5 seconds. It was also shown by benchmarking that request response round trip times were affected more by the mechanism of delivery of data; data embedded within an object or returned directly, rather than the actual payload. This was highlighted as only true for the test cases implemented. Fluctuations in primitive return times and insufficient time prevented further analysis that might have highlighted the exact impact of changing payload types and sizes upon the overall round trip time. JSB interaction tests were considered to be difficult to reconcile to the findings of benchmarking test cases. The benchmarking test cases all yielded a minimum round trip response time of at least 0.4 seconds. However for repeated responses it average response times were closer to 0.1 seconds. Returning to the problem of determining whether Web services are suitable for real time applications the following conclusions are drawn. 76
  • Michael Wong 151220 Features of ease of integration and tools available that allow programmers to developer Web services without expert knowledge in XML, SOAP or WSDL make Web services appropriate for application-to-application communication. Benchmarking tests conducted in this study suggest that the IBM WSDK offering is capable of delivering response times suitable for a real time implementation such as the JSB. The stated upper limit of 3 seconds for response times and a nominal operation of 1 second would be fulfilled by both benchmarking results and JSB interaction tests, subsequent to the first request being fulfilled. Given that the testing environment used low spec of server it is likely that by using higher spec hardware that response times could be reduced. Questions as to the results obtained from the JSB interaction tests remain. Further research is necessary to determine their validity. If the JSB interaction test cases are found to be valid it further supports the conclusion that real time Web services are as of now, 3rd quarter of 2003, viable for commercial use. If JSB interaction cases are found to be invalid less evidence is available to support this conclusion. Regardless of the validity of JSB interaction test cases further work is necessary in this field. The secondary objectives defined as below were not fulfilled. 1) Make predictions on the response times for the JSB, based on the findings from the primary objectives before converting the JSB to a Web Service. 2) Investigate the response times of the Web Service-based JSB implementation and analyse it correlation between predictions based on findings from primary objective 2, and actual results recorded. Secondary objective 2) was fulfilled in part by the simulation of JSB implementation through the JSB interaction test cases. However the intention was to fulfil these two objectives by a complete implementation of the JSB as a web service. With insufficient data collected through benchmarking preventing predictions from being made and insufficient time preventing a full JSB Web service implementation and the secondary objectives were not achieved. 77
  • Michael Wong 151220 6.2 Future Work Based on the conclusions drawn a recommendation would be made that a trial of the JSB as a Web service could be implemented. The author is confident that such a trial would indicate that Web services would perform sufficiently well for the purpose the JSB application although perhaps not as quickly as the existing application. From a more general perspective, the benefits of Web services are in the ease of integration, the cost savings of which would outweigh the cost of additional hardware and software optimisations to tweak the web service application to perform as well as the original application. Put differently the cost of hardware will continue to fall, however integration of complex systems remains a complex and therefore expensive issue. Implementing models such as Web services helps to reduce this cost. With regards to further work in benchmarking Web services extending existing work to produce a complete set of results is necessary. These test cases should encompass all primitive types as well as the use of arrays (where possible). Primitive data types should be returned directly as well as part of an array or vector and finally as part of a passed object, such that a complete set of benchmarks for primitive returning response times is created. The relationships between response times should then be explored. It was found that in this project differences in response times were too small to derive any conclusions, therefore it may provide insightful to dramatically increase payloads of each of the test cases proportionally to make differences more pronounced. Further work needs to be conducted into the actual impact of different data types on response times and overheads. Knowledge of the base processing time for a request or interaction separate from data processing and transmission would allow results from a complete set of benchmarks to be used to calculate the expected response time of a Web service. It was hoped that this would be one of the products of this study but unfortunately this has not been possible. Another goal that was not fulfilled in this project was the cross-platform study, which would inevitably need to occur for an unbiased study into Web services. The issue of cross-platform code portability also went untested which would also be a useful exercise in demonstrating how interoperable code and web services implementation techniques are. Issues of how a Web service may perform over the Internet also needs to be addressed. How well a Web service scales and its performance under stress. Work on the impact of Web services security such as XML-encryption, SOAP digital signatures etc is also necessary. The value of the data must be ensured by security as well as preserving response times. The tension between these two issues is particularly important area of study for the future of real time Web services. Where commercial contracts are made, issues of non-repudiation need to be investigated. How delivery of real time data over Web services can be proved. This is another particularly import issue, where issues such as Web services extended architecture for reliable messaging and integration of third party web services may be necessary for achieving non-repudiation. 78
  • Michael Wong 151220 6.3 Final Remarks This project has been interesting to conduct. Previous to this project the author had little exposure to Web services however a working knowledge of Web services architecture and deployment methods has been acquired. The author also had no experience of benchmarking techniques or the issues that surround the area. The author also experienced challenges in terms of timing, trying to establish a delicate balance between this investigation and work commitments. Project management is a key area, which has been highlighted by this project as a vital skill. This project has presented many issues, which had not previously been considered and has been a valuable learning experience. Web services for non real time applications have already been discussed much by the community however real time Web services are still in a stage of infancy. There are many issues still to be investigated, some of which are suggested in the future work section. Whether the future of Web services includes real time applications remains to be seen. It is the author’s conclusion that the benefits Web services bring to non-real time applications are equally applicable to real time applications and should be thoroughly investigated and experimented with. The author will become involved where possible and continue to read and listen for future developments of real time Web services with interest. 79
  • Michael Wong 151220 References Introduction [1] About Wimbledon – Alan Little ‘2003 Wimbledon Compendium’ http://www.wimbledon.org/en_GB/about/club.html [2] Wimbledon History http://www.wimbledon.org/en_GB/about/history.html [3] An E-business Solution: Wimbledon Scores an ace with IBM On Demand http://www.ibm.com/services/uk/ondemand/pdf/GSCUK01003-2.pdf [4] TCP RFC http://www.faqs.org/rfcs/rfc793.html [5] IP RFC http://www.faqs.org/rfcs/rfc791.html [6] HTTP RFC http://www.ietf.org/rfc/rfc2616.txt [7] BBC Weather Centre Homepage http://www.bbc.co.uk/weather/ [8] American Airlines Online Homepage http://www.aa.com/ [9] Broadvision 1to1 http://www.broadvision.com/OneToOne/SessionMgr/home_page.jsp [10] O2 Online Shop http://shop.o2.co.uk/shop/ [11] Java Server Pages http://java.sun.com/products/jsp/ [12] Finance at Yahoo.com http://finance.yahoo.com [13] W3C – Web Services Activity http://www.w3.org/2002/ws/ [14] IBM – Web Services – The Web’s Next Revolution http://www6.software.ibm.com/developerworks/education/wsbasics/wsbasics-ltr.pdf [15] Wimbledon.org 2003 Usage Statistics [16] BBC News – Slow Global Economic Growth http://news.bbc.co.uk/2/hi/business/2933601.stm [17] 2002 Wimbledon Broadcast – Press and Photographers http://www.wimbledon.org/en_GB/about/television.html [18] AELTC/IBM 2000 Web Team Report Andy Burns, John Tolva [19] AELTC/IBM 2001 Official Property Report Andy Burns, Lorrie Bilderback, John Kent, Elizabeth Roberts, John Taylor 80
  • Michael Wong 151220 [20] Linux at Wimbledon http://www-1.ibm.com/linux/wimbledon/ [21] Scalable, Secure Data Supply Using Web Services – Mark Crawley 2002 [22] IBM Products and Services – Pseries Servers http://www-132.ibm.com/content/home/store_IBMPublicUSA/en_US/eServer/pSeries/ pSeries.html 81
  • Michael Wong 151220 Review Web Services [1] Web Services Architecture Working Group – WSA WG http://www.w3.org/2002/ws/arch/ [2] Web Services Architecture Working Group – W3C Working Draft 14 November 2002 http://www.w3.org/TR/2002/WD-ws-arch-20021114/ [3] Oasis Web Services Reliable Messaging Technical Committee Homepage http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsrm [4] Handling Attachments in SOAP, Joshy Joseph 2002 http://www-106.ibm.com/developerworks/webservices/library/ws-soapatt/? open&l=930,t=grws [5] O’Reilly - Web Services Security Part 2, Siddigui Bilal 2003 http://webservices.xml.com/pub/a/ws/2003/04/01/security.html [6] Web Services Referral Protocol, Nielsen, F. H., et al. October 2001 http://msdn.microsoft.com/library/default.asp?url=/library/en- us/dnglobspec/html/wsreferspecindex.asp [7] Web Services Routing Protocol, Nielsen, F.H., Thatte, S., October 2001 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnglobspec/html/ws- routing.asp [8] W3C Extensible Markup Language Homepage http://www.w3.org/XML/ [9] W3C XML 1.0 Second Edition Recommendation, October 2000 http://www.w3.org/TR/2000/REC-xml-20001006#sec-prolog-dtd [10] Graham et al. 2001. XML Primer. In: Graham et al, ed. Building Web Services with Java – Making Sense of XML, SOAP, WSDL, and UDDI. SAMS 2001, pp 57. [11] W3C – Namespaces in XML, January 1999 http://www.w3.org/TR/REC-xml-names/ [12] W3C – XML Schema: Specification and Development, April 2000: updated August 2003 http://www.w3.org/XML/Schema#dev [13] W3C – SOAP 1.1, May 2000 http://www.w3.org/TR/SOAP/ [14] IBM MQSeries Product Page http://www-3.ibm.com/software/integration/mqfamily/ [15] W3C - WSDL 1.1, March 2001 http://www.w3.org/TR/wsdl [16] Graham et al. 2001. Describing Web Services. In: Graham et al, ed. Building Web Services with Java – Making Sense of XML, SOAP, WSDL, and UDDI. SAMS 2001, pp 323. [17] UDDI Org Homepage http://www.uddi.org/ [18] Sun – UDDI – An Executive Summary, MacRoibeaird, S. http://wwws.sun.com/software/xml/developers/uddi/ 82
  • Michael Wong 151220 [19] SearchWebServices.com – tModel http://searchwebservices.techtarget.com/sDefinition/0,,sid26_gci805760,00.html [20] DAML-S Homepage http://www.daml.org/services/ [IBM-WSarch-2000] Web Service architecture overview http://www-106.ibm.com/developerworks/web/library/w-ovr/?dwzone=ws 83
  • Michael Wong 151220 Web Services developer kits – hosting platforms [1] Phillips, A., Wong, M., 2002, WIS Usage Statistics 2002, IBM Hursley [2] IBM WSDK Homepage http://www-106.ibm.com/developerworks/offers/ws-speed-start/wsdk.html [3] Java Web Services Development Pack 1.2 http://java.sun.com/webservices/webservicespack.html [4] Apache ANT Homepage http://ant.apache.org/ [5] Sun JavaServer Pages Standard Tag Library Homepage http://java.sun.com/products/jsp/jstl/ [6] Apache AXIS User Guide http://cvs.apache.org/viewcvs.cgi/~checkout~/xml-axis/java/docs/user-guide.html [7] Microsoft Web Services http://msdn.microsoft.com/webservices/ [8] Getting started with .NET framework and Visual Studio .NET http://msdn.microsoft.com/webservices/building/frameworkandstudio/default.aspx [9] Apache AXIS Introduction Page [Accessed: August 2003] http://ws.apache.org/axis/intro.html [10] JAX RPC Change Log [Accessed: August 2003] http://www.jcp.org/aboutJava/communityprocess/maintenance/jsr101/jaxrpc- changelog.html [11] Web Services Interoperability Home Page http://www.ws-i.org/Profiles/Basic/2003-06/BasicProfile-1.0-BdAD.html [12] Apache AXIS Installation Guide [Accessed: August 2003] http://cvs.apache.org/viewcvs.cgi/~checkout~/xml-axis/java/docs/install.html#intro [13] Jakarta Tomcat Home Page [Accessed: August 2003] http://jakarta.apache.org/tomcat/ 84
  • Michael Wong 151220 Quality of Service – Performance and Tuning [1] Mani, A., Nagarajan, A., Understanding Quality of Web Services [January 2002] http://www-106.ibm.com/developerworks/library/ws-quality.html [2] Coulouris, G., J. Dollimore, T. Kindberg, 2001. Architectural Models. In: Coulouris, G., J. Dollimore, T. Kindberg, ed. Distributed Systems Concepts and Design Third Edition. Harlow: Addison-Wesley, 2001, pp 45. [3] Coulouris, G., J. Dollimore, T. Kindberg, 2001. Distributed Systems Concepts and Design Third Edition. Harlow: Addison-Wesley. [4] Nielsen, J., Human Factors of Password Security http://useit.mondosearch.com/cgi-bin/MsmGo.exe? grab_id=5186336&EXTRA_ARG=&host_id=2&page_id=391&query=security&hiword=SECU RITY+SECURE+ [5] W3C Security Resources [no date]. http://www.w3.org/Security/ [6] Mercury Interactive Loadrunner http://www-heva.mercuryinteractive.com/products/loadrunner/ [7] Weibull.com – Throughput metrics and terminology http://www.weibull.com/SystemRelWeb/throughput_metrics_and_terminology.htm [8] Tanenbaum, A, S., 2003. Multiple Access Protocols. In: Tanenbaum, A, S., 2003. Computer Networks Fourth Edition. New Jersey: Prentice Hall PTR, 2003, pp 255-258 [9] CERT/CC – Denial of Service [June 2001] Available from: http://www.cert.org/tech_tips/denial_of_service.html 85
  • Michael Wong 151220 Java Scoreboard Architecture [1] Microsoft - Microsoft Windows NT Server 4.0 WINS: Architecture and Capacity Planning, 1996 http://msdn.microsoft.com/library/default.asp?url=/library/en- us/dnnetbios/html/msdn_winswp.asp [2] IBM DB2 Product Page http://www-3.ibm.com/software/data/db2/ [3] IBM DB2 UDF Programming Guide http://www-3.ibm.com/software/data/db2/udb/ad/v7/adg/db2a0/frame3.htm#udf [4] IBM MQSeries Product Page http://www-3.ibm.com/software/integration/mqfamily/ 86
  • Michael Wong 151220 Java Scoreboard Interaction Analysis [1] Scalable Simulation Framework http://www.ssfnet.org/javadoc/SSF/OS/Socket/socketMaster.html [2] MIDP 2.0 Push Registry http://wireless.java.sun.com/midp/articles/pushreg/ [3] Java JMS Homepage http://java.sun.com/products/jms/ 87
  • Michael Wong 151220 Benchmarking Web Services [1] Internet Engineering Task Force (IEFT) Homepage http://www.ietf.org/ [2] IETF Benchmarking Working Group (BMWG) http://www.ietf.org/html.charters/bmwg-charter.html [3] IETF BMWG – Benchmarking Basic OPSF Single Router Control Plane Convergence http://www.ietf.org/internet-drafts/draft-ietf-bmwg-ospfconv-intraarea-06.txt [4] Java – Primitive Data types http://java.sun.com/docs/books/tutorial/java/nutsandbolts/datatypes.html [5] Sun Web Services and J2EE 1.4 – “Defining the next generation of Web Services” section http://xml.coverpages.org/SunJavaWebServices.html 88
  • Michael Wong 151220 Design [1] Mani, A., Nagarajan, A., Understanding Quality of Web Services [January 2002] http://www-106.ibm.com/developerworks/library/ws-quality.html [2] W3C – Web Service Architecture Usage Scenarios Working Draft [July 2002] http://www.w3.org/TR/2002/WD-ws-arch-scenarios-20020730/#S004 [3] IBM WSDK Tutorial – Creating Web Services from Java Classes https://www6.software.ibm.com/developerworks/education/ws-cwsjc/index.html? x=80&y=8 [4] TheAge.com – Aces low and bounces high http://www.theage.com.au/text/articles/2003/06/06/1054700386790.htm [5] Webopedia – definition for “Access Time” http://www.webopedia.com/TERM/A/access_time.html [6] Softros Network Time System http://www.softros.com/nt-system.php [7] Max Values in Java http://www.tvdsb.on.ca/Montcalm/depts/comp/ICS3M1/Unit%203_Begin%20to %20Program/variables_in_java.htm [8] IBM.com – Detailed Technical Specification for 300PL 6584 P1G ftp://ftp.software.ibm.com/pc/pccbbs/commercial_desktop/d4br5f.pdf [9] Virtual Network Computing with AT&T Labs Cambridge Homepage http://www.uk.research.att.com/vnc/ [10] Sun – Java J2SE 1.4.1 http://java.sun.com/j2se/1.4.1/download.html [11] IBM.com – Detailed Technical Specification for Thinkpad 600x 2654 5FG http://www-3.ibm.com/pc/support/site.wss/document.do?lndocid=MIGR-4CYN8Z [12] Eclipse.org Homepage http://eclipse.org/ 89
  • Michael Wong 151220 Implementation [1] Sun - Java Security Manager http://java.sun.com/docs/books/tutorial/essential/system/securityIntro.html [2] Axis Mail Archive – No support for Char http://www.mail-archive.com/axis-user@xml.apache.org/msg04696.html [3] Axis Mail Archive – No support for ArrayOf_Xsd_string on Apache SOAP client http://www.mail-archive.com/axis-user@xml.apache.org/msg12363.html [4] IBM WSDK Home – Explanation of Bean2Web Service tool http://www-106.ibm.com/developerworks/webservices/library/ws-wsdk.html [5] Build Interoperable Web Services with JSR-109 http://www-106.ibm.com/developerworks/webservices/library/ws-jsrart/ [6] AXIS Mail Archive – SAXException: SimpleDeserializer http://www.mail-archive.com/axis-dev@ws.apache.org/msg01583.html 90
  • Michael Wong 151220 Analysis of Results and Evaluation [1] Sun – Java data types http://java.sun.com/docs/books/tutorial/java/nutsandbolts/datatypes.html [2] Lecture 12 – Writing SOAP with Java and AXIS http://dsg.port.ac.uk/mab [3] Source Forge Java Doc for Axis message client http://smfw.sourceforge.net/javadoc/org/sape/smfw/soapengine/MessageClient.html [4] American Institute of Physics – Werner Heisenberg and the Uncertainty Principle http://www.aip.org/history/heisenberg/ [5] Sitaram C. V. R, and Ragunathan R., and Farnam J., In Monitoring Timing Constraints in Distributed Real-Time Systems – {IEEE} Real-Time Systems Symposium 1992, pp 57 - 67 91
  • Michael Wong 151220 List of Figures FIGURE 1 : SERVICE ORIENTED ARCHITECTURE [2]...........................................................17 FIGURE 2 : ROADS - XML EXAMPLE ....................................................................................20 FIGURE 3: ROADS – DATA STRUCTURE...............................................................................20 FIGURE 4 : JAVA SCOREBOARD INTERACTIONS..................................................................35 FIGURE 5 : JAVA SCOREBOARD WEB SERVICE INTERACTIONS...........................................36 FIGURE 6 : RPC ARCHITECTURE WITH APP SERVER [2]......................................................42 FIGURE 7 : JSB TEST CASE 1...............................................................................................44 FIGURE 8 : JSB TEST CASE 2...............................................................................................44 FIGURE 9 : JSB TEST CASE 3...............................................................................................45 FIGURE 10 : JSB TEST CASE 4.............................................................................................45 FIGURE 11 : BENCHMARKING TEST CASE MODEL - SIMPLE RPC..........................................46 FIGURE 12 : BENCHMARKING TEST CASE MODEL - COMPLEX RPC.......................................46 FIGURE 13 : STACK TRACE SAMPLE - NO SERIALIZER FOR JAVA.LANG.CHARACTER...........56 FIGURE 14 : SAMPLE BATCH SCRIPT FOR RUNNING TEST CASE REQUESTORS....................60 FIGURE 15 : SAMPLE STACK TRACE – CONNECTION REFUSED.............................................60 FIGURE 16 : SAMPLE STACK TRACE – SAXEXCEPTION: SIMPLE DESERIALIZER...................60 FIGURE 17 : REQUEST RESPONSE TIME AVERAGES – BYTE.MAX_VALUE.............................63 FIGURE 18 : REQUEST RESPONSE TIME AVERAGES – LONG.MAX_VALUE............................63 FIGURE 19 : REQUEST RESPONSE TIME AVERAGES – 8 CHARACTER STRING.......................64 FIGURE 20 : AVERAGE RESPONSE TIMES – 1ST REQUEST...................................................64 FIGURE 21 : AVERAGE RESPONSE TIMES – EXCLUDING 1ST REQUEST................................65 FIGURE 22 : COMPLETE AVERAGE RESPONSE TIMES – EXCLUDING 1ST REQUEST...............65 FIGURE 23 : 1ST REQUEST MEAN ROUND TRIP TIME FOR ALL COMPLEX TESTS..................67 FIGURE 24 : AVERAGE RESPONSE TIMES – BYTES EXCLUDING 1ST REQUEST COMPARISON ...........................................................................................................................................68 FIGURE 25 : AVERAGE RESPONSE TIMES – LONG EXCLUDING 1ST REQUEST COMPARISON 68 FIGURE 26 : AVERAGE RESPONSE TIMES – STRING EXCLUDING 1ST REQUEST COMPARISON ...........................................................................................................................................68 FIGURE 27 : JSB INTERACTION TEST CASE RESULTS..........................................................70 FIGURE 28 : MODIFIED OCCASIONAL PAYLOAD ROUND TRIP TIMES..................................71 92
  • Michael Wong 151220 APPENDICES 93
  • Michael Wong 151220 Appendix A: Requirements To: Michael Wong1/UK/IBM@IBMGB cc: From: Alex Phillips/UK/IBM@IBMGB Subject: Re: JSB update times Hi Mike, Under normal conditions I’d expect to see the JSB updating the clients at anything under a second. When the load on the server becomes high such as when we have a lot of concurrently connected clients an upper limit of about 3 seconds is acceptable. Cheers, Alex. -------------- Original Message -------------- To: Alex Phillips/UK/IBM@IBMGB cc: From: Michael Wong1/UK/IBM@IBMGB Subject: JSB update times Hi Alex, I’m putting together a list of requirements for the review of Web services suitability for the Java Scoreboard. I was hoping you could give me an indication as to what you see as acceptable response times for the JSB server to update the client. An idea of nominal operation and maximum acceptable limit would be great, Kind Regards, Michael Michael Wong :: New Media Programmer :: IBM Global Services ====================================================== [e-Mail] Ext : : Mike.Wong@uk.ibm.com Int : : Michael Wong1/uk/ibm [Phone] Ext : : 01962 818885 Int : : 248885 [Mail] Ext : : IBM UK Labs, Hursley Park, Winchester, SO21 2JN Int : : HUR 152 94
  • Michael Wong 151220 Appendix B: Wimblive Database - Current View Describe sqltype sqllen sqlname.data sqlname.length ------------------- ------ ----------------------- -------------- 448 VARCHAR 8 EVENT_ID 8 452 CHARACTER 1 ROUND 5 501 SMALLINT 2 COURT_ID 8 496 INTEGER 4 MATCH_ID 8 501 SMALLINT 2 CURRENT_SERVER 14 449 VARCHAR 64 PLAYER1A 8 449 VARCHAR 12 PLAYER1A_ATP 12 449 VARCHAR 64 PLAYER1B 8 449 VARCHAR 12 PLAYER1B_ATP 12 449 VARCHAR 64 PLAYER2A 8 449 VARCHAR 12 PLAYER2A_ATP 12 449 VARCHAR 64 PLAYER2B 8 449 VARCHAR 12 PLAYER2B_ATP 12 501 SMALLINT 2 SET_1_1 7 501 SMALLINT 2 TIEBREAKER_1_1 14 501 SMALLINT 2 SET_2_1 7 501 SMALLINT 2 TIEBREAKER_2_1 14 501 SMALLINT 2 SET_3_1 7 501 SMALLINT 2 TIEBREAKER_3_1 14 501 SMALLINT 2 SET_4_1 7 501 SMALLINT 2 TIEBREAKER_4_1 14 501 SMALLINT 2 SET_5_1 7 501 SMALLINT 2 TIEBREAKER_5_1 14 501 SMALLINT 2 SET_1_2 7 501 SMALLINT 2 TIEBREAKER_1_2 14 501 SMALLINT 2 SET_2_2 7 501 SMALLINT 2 TIEBREAKER_2_2 14 501 SMALLINT 2 SET_3_2 7 501 SMALLINT 2 TIEBREAKER_3_2 14 501 SMALLINT 2 SET_4_2 7 501 SMALLINT 2 TIEBREAKER_4_2 14 501 SMALLINT 2 SET_5_2 7 501 SMALLINT 2 TIEBREAKER_5_2 14 449 VARCHAR 2 GAME_1 6 449 VARCHAR 2 GAME_2 6 453 CHARACTER 1 STATUS 6 501 SMALLINT 2 CURRENT_SET 11 453 CHARACTER 1 IS_TIEBREAK 11 501 SMALLINT 2 LAST_SRV_SPEED 14 95
  • Michael Wong 151220 Appendix C: Background Services (running during testing) • Background Intelligent Transfer Service • COM+ event systems • Computer Browser • DHCP Client • DNS Client • Event Log • Logical Disk Manager • Network connections • Plug and Play – cannot be “stopped” • Remote access connection manager • RPC • RPC Locator • Removable Storage • RunAsService • Security Accounts Manager • Server • System Event Notifcation • Task Scheduler • TCP/IP NetBIOS Helper Service • Telephony • Windows Management Instrumentation • Windows Management Instrumentation Driver Extensions 96
  • Michael Wong 151220 Appendix D: Communication - Softros Re: Network Time System Latency To: Michael Wong1/UK/IBM@IBMGB cc: From: Eric Baron <support@softros.com> Subject: Re: NTS: Discrepancy between client(s) and server Hi Michael, Thank you for evaluating of our product. Yes, it will be less than 50 milliseconds, it can change between 5-35 milliseconds. Thank you. Eric Baron Technical Support Softros Systems, Inc. http://www.softros.com support@softros.com -------------- Original Message -------------- Hi, I'm trialing your Network Time System at the moment and was curious to know what kind of discrepancies I should be expecting? I'm running the client and server on a tiny LAN with only two machines through a fast Ethernet switch and am seeing pings of < 32 ms. I guess that the discrepancy should be less that 50ms? Kind Regards, Michael Michael Wong :: New Media Programmer :: IBM Global Services ====================================================== [e-Mail] Ext : : Mike.Wong@uk.ibm.com Int : : Michael Wong1/uk/ibm [Phone] Ext : : 01962 818885 Int : : 248885 [Mail] Ext : : IBM UK Labs, Hursley Park, Winchester, SO21 2JN Int : : HUR 152 97
  • Michael Wong 151220 Appendix E: Error Log for no Character mapping in AXIS java.io.IOException: java.io.IOException: No serializer found for class java.lang.Character in registry org.apache.axis.encoding.TypeMappingImpl@217cbd5c java.io.IOException: java.io.IOException: No serializer found for class java.lang.Character in registry org.apache.axis.encoding.TypeMappingImpl@217cbd5c at org.apache.axis.encoding.ser.BeanSerializer.serialize(BeanSerializer.java:266) at org.apache.axis.encoding.SerializationContextImpl.serializeActual(SerializationContext Impl.java:1232) at org.apache.axis.encoding.SerializationContextImpl.serialize(SerializationContextImpl.j ava:757) at org.apache.axis.message.RPCParam.serialize(RPCParam.java:224) at org.apache.axis.message.RPCElement.outputImpl(RPCElement.java:336) at org.apache.axis.message.MessageElement.output(MessageElement.java:751) at org.apache.axis.message.SOAPBody.outputImpl(SOAPBody.java:142) at org.apache.axis.message.SOAPEnvelope.outputImpl(SOAPEnvelope.java:401) at org.apache.axis.message.MessageElement.output(MessageElement.java:751) at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:273) at org.apache.axis.SOAPPart.getAsString(SOAPPart.java:488) at org.apache.axis.SOAPPart.getAsBytes(SOAPPart.java:379) at org.apache.axis.Message.getContentType(Message.java:400) at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:730) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:335) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictServletInstance. java:110) at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLifecycleServlet .java:174) at com.ibm.ws.webcontainer.servlet.IdleServletState.service(StrictLifecycleServlet.java:3 13) at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(StrictLifecycleServlet. java:116) at com.ibm.ws.webcontainer.servlet.ServletInstance.service(ServletInstance.java:258) at com.ibm.ws.webcontainer.servlet.ValidServletReferenceState.dispatch(ValidServletRefere nceState.java:42) at com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(ServletInstanceRefer ence.java:40) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDispatch(WebAppRequ estDispatcher.java:872) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatche r.java:491) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher .java:173) at com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.java:79) at com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java:199) at com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation(CachedInvoc ation.java:71) at com.ibm.ws.webcontainer.cache.invocation.CacheableInvocationContext.invoke(CacheableIn vocationContext.java:114) at com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProces sor.java:187) at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSEListener.java:331 ) at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java:56) at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java:432) at com.ibm.ws.http.HttpConnection.run(HttpConnection.java:343) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:592) 98
  • Michael Wong 151220 Appendix F: Sample Batch Script for running test cases @echo off set libpath=C:WSDK_v5appserverlib set requestorpath=C:WSDK_v5appscomplexRPC4requestorsrc set SEIpath=C:WSDK_v5appscomplexRPC4requestorsrcclient- sidelpcrrhighpayloadcomplexrpcserver java -classpath %libpath%j2ee.jar;%libpath%axis.jar;%libpath%qname.jar;%libpath%jaxrpc.jar;%libpath %wsdl4j.jar;%libpath %xerces.jar;%libpath%commons-discover.jar;%libpath%saaj.jar;%libpath%commons- logging-api.jar;%requestor path%;%SEIpath%RRHighPayload_SEI.class;%SEIpath%RRHighPayload_SEIService.class; %SEIpath%RRHighPayload_SE IServiceLocator.class;%SEIpath%RRHighPayloadSoapBindingStub.class lpc.rrhighpayload.complexrpc.client.RRHighPayloadClient 99
  • Michael Wong 151220 Appendix G: Axis Fault - Connection Refused Stack Trace C:WSDK_v5appscomplexRPC4requestorsrclpcrrhighpayloadcomplexrpcclient>RR HighPayloadClient AxisFault faultCode: {http://xml.apache.org/axis/}Server.userException faultString: java.net.ConnectException: Connection refused: no further informat ion faultActor: null faultDetail: stackTrace: java.net.ConnectException: Connection refused: no further in formation at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(Unknown Source) at java.net.PlainSocketImpl.connectToAddress(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.Socket.&lt;init&gt;(Unknown Source) at java.net.Socket.&lt;init&gt;(Unknown Source) at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSoc ketFactory.java:131) at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:1 58) at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:115) at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrateg y.java:71) at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:156) at org.apache.axis.SimpleChain.invoke(SimpleChain.java:126) at org.apache.axis.client.AxisClient.invoke(AxisClient.java:182) at org.apache.axis.client.Call.invokeEngine(Call.java:2278) at org.apache.axis.client.Call.invoke(Call.java:2267) at org.apache.axis.client.Call.invoke(Call.java:1970) at org.apache.axis.client.Call.invoke(Call.java:1896) at org.apache.axis.client.Call.invoke(Call.java:1424) at lpc.rrhighpayload.complexrpc.server.RRHighPayloadSoapBindingStub.make Request(RRHighPayloadSoapBindingStub.java:144) at lpc.rrhighpayload.complexrpc.client.RRHighPayloadClient.run(RRHighPay loadClient.java:49) java.net.ConnectException: Connection refused: no further information java.net.ConnectException: Connection refused: no further information at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(Unknown Source) at java.net.PlainSocketImpl.connectToAddress(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSoc ketFactory.java:131) at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:1 58) at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:115) at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrateg y.java:71) at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:156) at org.apache.axis.SimpleChain.invoke(SimpleChain.java:126) at org.apache.axis.client.AxisClient.invoke(AxisClient.java:182) at org.apache.axis.client.Call.invokeEngine(Call.java:2278) at org.apache.axis.client.Call.invoke(Call.java:2267) at org.apache.axis.client.Call.invoke(Call.java:1970) at org.apache.axis.client.Call.invoke(Call.java:1896) at org.apache.axis.client.Call.invoke(Call.java:1424) at lpc.rrhighpayload.complexrpc.server.RRHighPayloadSoapBindingStub.make Request(RRHighPayloadSoapBindingStub.java:144) at lpc.rrhighpayload.complexrpc.client.RRHighPayloadClient.run(RRHighPay loadClient.java:49) [INFO] enterprise - -Mapping Exception to AxisFault <java.net.ConnectException: Connection refused: no further information> RRHighPayloadClient exceptionjava.net.ConnectException: Connection refused: no f urther information. 100
  • Michael Wong 151220 Appendix H: Source files Only source files from four of the applications have been included. “returnLong” simple RPC and “returnByteComplex” complex RPC for the benchmarking tests and the One Way request (simple RPC) and “Collect and Update/ComplexRPC4” (complex RPC) test case. These represent the major test cases and their variations, the remaining source can be located on the attached cd. Return Long - Simple RPC /** * LongPayload_SEIService.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.longpayload.simplerpc.server; public interface LongPayload_SEIService extends javax.xml.rpc.Service { public java.lang.String getLongPayloadAddress(); public lpc.longpayload.simplerpc.server.LongPayload_SEI getLongPayload() throws javax.xml.rpc.ServiceException; public lpc.longpayload.simplerpc.server.LongPayload_SEI getLongPayload(java.net.URL portAddress) throws javax.xml.rpc.ServiceException; } /** * LongPayload_SEIServiceLocator.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.longpayload.simplerpc.server; public class LongPayload_SEIServiceLocator extends org.apache.axis.client.Service implements lpc.longpayload.simplerpc.server.LongPayload_SEIService { // Use to get a proxy class for LongPayload private final java.lang.String LongPayload_address = "http://localhost:6080/returnLong/services/LongPayload"; public java.lang.String getLongPayloadAddress() { return LongPayload_address; } // The WSDD service name defaults to the port name. private java.lang.String LongPayloadWSDDServiceName = "LongPayload"; public java.lang.String getLongPayloadWSDDServiceName() { return LongPayloadWSDDServiceName; } public void setLongPayloadWSDDServiceName(java.lang.String name) { LongPayloadWSDDServiceName = name; } public lpc.longpayload.simplerpc.server.LongPayload_SEI getLongPayload() throws javax.xml.rpc.ServiceException { java.net.URL endpoint; try { endpoint = new java.net.URL(LongPayload_address); } catch (java.net.MalformedURLException e) { return null; // unlikely as URL was validated in WSDL2Java 101
  • Michael Wong 151220 } return getLongPayload(endpoint); } public lpc.longpayload.simplerpc.server.LongPayload_SEI getLongPayload(java.net.URL portAddress) throws javax.xml.rpc.ServiceException { try { lpc.longpayload.simplerpc.server.LongPayloadSoapBindingStub _stub = new lpc.longpayload.simplerpc.server.LongPayloadSoapBindingStub(portAddress, this); _stub.setPortName(getLongPayloadWSDDServiceName()); return _stub; } catch (org.apache.axis.AxisFault e) { return null; } } /** * For the given interface, get the stub implementation. * If this service has no port for the given interface, * then ServiceException is thrown. */ public java.rmi.Remote getPort(Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException { try { if (lpc.longpayload.simplerpc.server.LongPayload_SEI.class.isAssignableFrom(serviceEndpointInterface)) { lpc.longpayload.simplerpc.server.LongPayloadSoapBindingStub _stub = new lpc.longpayload.simplerpc.server.LongPayloadSoapBindingStub(new java.net.URL(LongPayload_address), this); _stub.setPortName(getLongPayloadWSDDServiceName()); return _stub; } } catch (java.lang.Throwable t) { throw new javax.xml.rpc.ServiceException(t); } throw new javax.xml.rpc.ServiceException("There is no stub implementation for the interface: " + (serviceEndpointInterface == null ? "null" : serviceEndpointInterface.getName())); } /** * For the given interface, get the stub implementation. * If this service has no port for the given interface, * then ServiceException is thrown. */ public java.rmi.Remote getPort(javax.xml.namespace.QName portName, Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException { if (portName == null) { return getPort(serviceEndpointInterface); } String inputPortName = portName.getLocalPart(); if ("LongPayload".equals(inputPortName)) { return getLongPayload(); } else { java.rmi.Remote _stub = getPort(serviceEndpointInterface); ((org.apache.axis.client.Stub) _stub).setPortName(portName); return _stub; } } public javax.xml.namespace.QName getServiceName() { return new javax.xml.namespace.QName("http://server.simplerpc.longpayload.lpc", "LongPayload_SEIService"); } private java.util.HashSet ports = null; public java.util.Iterator getPorts() { 102
  • Michael Wong 151220 if (ports == null) { ports = new java.util.HashSet(); ports.add(new javax.xml.namespace.QName("LongPayload")); } return ports.iterator(); } } /** * LongPayloadSoapBindingStub.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.longpayload.simplerpc.server; public class LongPayloadSoapBindingStub extends org.apache.axis.client.Stub implements lpc.longpayload.simplerpc.server.LongPayload_SEI { private java.util.Vector cachedSerClasses = new java.util.Vector(); private java.util.Vector cachedSerQNames = new java.util.Vector(); private java.util.Vector cachedSerFactories = new java.util.Vector(); private java.util.Vector cachedDeserFactories = new java.util.Vector(); public LongPayloadSoapBindingStub() throws org.apache.axis.AxisFault { this(null); } public LongPayloadSoapBindingStub(java.net.URL endpointURL, javax.xml.rpc.Service service) throws org.apache.axis.AxisFault { this(service); super.cachedEndpoint = endpointURL; } public LongPayloadSoapBindingStub(javax.xml.rpc.Service service) throws org.apache.axis.AxisFault { if (service == null) { super.service = new org.apache.axis.client.Service(); } else { super.service = service; } } private org.apache.axis.client.Call createCall() throws java.rmi.RemoteException { try { org.apache.axis.client.Call _call = (org.apache.axis.client.Call) super.service.createCall(); if (super.maintainSessionSet) { _call.setMaintainSession(super.maintainSession); } if (super.cachedUsername != null) { _call.setUsername(super.cachedUsername); } if (super.cachedPassword != null) { _call.setPassword(super.cachedPassword); } if (super.cachedEndpoint != null) { _call.setTargetEndpointAddress(super.cachedEndpoint); } if (super.cachedTimeout != null) { _call.setTimeout(super.cachedTimeout); } if (super.cachedPortName != null) { _call.setPortName(super.cachedPortName); } java.util.Enumeration keys = super.cachedProperties.keys(); while (keys.hasMoreElements()) { java.lang.String key = (java.lang.String) keys.nextElement(); _call.setProperty(key, super.cachedProperties.get(key)); 103
  • Michael Wong 151220 } return _call; } catch (java.lang.Throwable t) { throw new org.apache.axis.AxisFault("Failure trying to get the Call object", t); } } public void run() throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setReturnType(org.apache.axis.encoding.XMLType.AXIS_VOID); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setEncodingStyle(null); _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE); _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); _call.setOperationStyle("rpc"); _call.setOperationUse("literal"); _call.setOperationName(new javax.xml.namespace.QName("http://server.simplerpc.longpayload.lpc", "run")); java.lang.Object _resp = _call.invoke(new java.lang.Object[] {}); if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } } public long getData() throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setReturnType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "long"), long.class); _call.setReturnQName(new javax.xml.namespace.QName("", "getDataReturn")); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setEncodingStyle(null); _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE); _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); _call.setOperationStyle("rpc"); _call.setOperationUse("literal"); _call.setOperationName(new javax.xml.namespace.QName("http://server.simplerpc.longpayload.lpc", "getData")); java.lang.Object _resp = _call.invoke(new java.lang.Object[] {}); if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } else { try { return ((java.lang.Long) _resp).longValue(); } catch (java.lang.Exception _exception) { return ((java.lang.Long) org.apache.axis.utils.JavaUtils.convert(_resp, long.class)).longValue(); } } } } LongPayload_SEI.wsdl <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://server.simplerpc.longpayload.lpc" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" 104
  • Michael Wong 151220 xmlns:impl="http://server.simplerpc.longpayload.lpc" xmlns:intf="http://server.simplerpc.longpayload.lpc" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:types/> <wsdl:message name="getDataResponse"> <wsdl:part name="getDataReturn" type="xsd:long"/> </wsdl:message> <wsdl:message name="runResponse"> </wsdl:message> <wsdl:message name="runRequest"> </wsdl:message> <wsdl:message name="getDataRequest"> </wsdl:message> <wsdl:portType name="LongPayload_SEI"> <wsdl:operation name="run"> <wsdl:input message="intf:runRequest" name="runRequest"/> <wsdl:output message="intf:runResponse" name="runResponse"/> </wsdl:operation> <wsdl:operation name="getData"> <wsdl:input message="intf:getDataRequest" name="getDataRequest"/> <wsdl:output message="intf:getDataResponse" name="getDataResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="LongPayloadSoapBinding" type="intf:LongPayload_SEI"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="run"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="runRequest"> <wsdlsoap:body namespace="http://server.simplerpc.longpayload.lpc" use="literal"/> </wsdl:input> <wsdl:output name="runResponse"> <wsdlsoap:body namespace="http://server.simplerpc.longpayload.lpc" use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getData"> <wsdlsoap:operation soapAction=""/> 105
  • Michael Wong 151220 <wsdl:input name="getDataRequest"> <wsdlsoap:body namespace="http://server.simplerpc.longpayload.lpc" use="literal"/> </wsdl:input> <wsdl:output name="getDataResponse"> <wsdlsoap:body namespace="http://server.simplerpc.longpayload.lpc" use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="LongPayload_SEIService"> <wsdl:port binding="intf:LongPayloadSoapBinding" name="LongPayload"> <wsdlsoap:address location="http://localhost:6080/returnLong/services/LongPayload"/> </wsdl:port> </wsdl:service> </wsdl:definitions> ibm-webservices-bnd.xml <?xml version="1.0" encoding="UTF-8"?> <wsbinding> <ws-desc-binding ws-desc-name-link="LongPayload_SEIService"> <pc-binding pc-name-link="LongPayload"> </pc-binding> </ws-desc-binding> </wsbinding> /* * Created on 22-Aug-2003 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ package lpc.longpayload.simplerpc.client; import lpc.longpayload.simplerpc.server.*; import java.util.*; import java.io.*; /** * @author Administrator * * To change the template for this generated type comment go to * Window - Preferences - Java - Code Generation - Code and Comments */ public class LongPayloadClient extends Thread { long timeStamp; String logEntry; Vector startPointTimestamps = new Vector(); Vector endPointTimestamps = new Vector(); public LongPayloadClient(){ super(); this.start(); } public void run(){ 106
  • Michael Wong 151220 //disable any security settings that may be in place System.setSecurityManager(null); try { LongPayload_SEIService loc = new LongPayload_SEIServiceLocator(); LongPayload_SEI port = (LongPayload_SEI)loc.getLongPayload(); //timestamping START TIME makeLogEntry(startPointTimestamps); port.getData(); //System.out.println(i + " number of calls to web service"); //log end point after each 'poll' makeLogEntry(endPointTimestamps); }catch(Exception e){ System.out.println("LongPayload exception" + e); } //end the testcase - write START TIMEs and END TIMEs to file endTestCase(); } public static void main(String[] args){ LongPayloadClient aLongPayloadClient = new LongPayloadClient(); } public void makeLogEntry(Vector timestampLogs){ timeStamp = System.currentTimeMillis(); if(timestampLogs.equals(startPointTimestamps)) logEntry = " - " + timeStamp + " " + " STARTPOINT"; else{ //want to "pair" log entries - only increment counter if ENDPOINT logEntry = " - " + timeStamp + " " + " ENDPOINT"; } timestampLogs.add(logEntry); }//end makeLogEntry() private void writeResultsToFile(Vector timestampLogs, String filename){ //FileOutputStream fout; RandomAccessFile raf; System.setSecurityManager(null); String logEntry = ""; long filelength; String ENDL = System.getProperty("line.separator"); try{ //open a new output stream //fout = new FileOutputStream(filename); 107
  • Michael Wong 151220 File f = new File(filename); //new RandomAccessFile raf = new RandomAccessFile(filename, "rw"); //set up a loop to iterate through counter length //write each entry to file //ListIterator iter = timestampLogs.listIterator(); for(int i=0; i < timestampLogs.size(); i++){ logEntry = logEntry + (String)timestampLogs.get(i) + ENDL; } //fout.close(); filelength = f.length(); raf.seek(filelength); raf.writeBytes(logEntry); raf.close(); }catch(IOException e){ System.err.println("Unable to print to file"); System.exit(-1); }//end try catch block }//end writeResultsToFile private void outputResults(int[] returnedInts){ //FileOutputStream fout; //PrintStream ps; RandomAccessFile raf; long filelength; String ENDL = System.getProperty("line.separator"); System.setSecurityManager(null); try{ //open a new output stream //new RandomAccessFile File f = new File("Integerscoreupdates.txt"); raf = new RandomAccessFile(f, "rw"); filelength = f.length(); raf.seek(filelength); for(int i = 0; i < returnedInts.length; i++) raf.writeBytes("" + returnedInts[i]); raf.close(); //fout.close(); //ps.close(); }catch(IOException e){ System.err.println("Unable to print to file"); System.exit(-1); }//end try catch block }//end outputResults() public void endTestCase(){ writeResultsToFile(startPointTimestamps, "LongPayloadStartPoint.txt"); 108
  • Michael Wong 151220 writeResultsToFile(endPointTimestamps, "LongPayloadEndPoint.txt"); } } LongPayload_SEI_Mapping.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE java-wsdl-mapping PUBLIC "-//IBM Corporation, Inc.//DTD J2EE JAX-RPC mapping 1.0//EN" "http://www.ibm.com/webservices/dtd/j2ee_jaxrpc_mapping_1_0.dtd"> <java-wsdl-mapping> <package-mapping> <package-type>lpc.longpayload.simplerpc.server</package-type> <namespaceURI>http://server.simplerpc.longpayload.lpc</namespaceURI> </package-mapping> </java-wsdl-mapping> Webservices.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE webservices PUBLIC "-//IBM Corporation, Inc.//DTD J2EE Web services 1.0//EN" "http://www.ibm.com/webservices/dtd/j2ee_web_services_1_0.dtd"> <webservices> <webservice-description> <webservice-description-name>LongPayload_SEIService</webservice-description-name> <wsdl-file>WEB-INF/LongPayload_SEI.wsdl</wsdl-file> <jaxrpc-mapping-file>WEB-INF/LongPayload_SEI_mapping.xml</jaxrpc-mapping-file> <port-component> <port-component-name>LongPayload</port-component-name> <wsdl-port> <namespaceURI>http://server.simplerpc.longpayload.lpc</namespaceURI> <localpart>LongPayload</localpart> </wsdl-port> <service-endpoint-interface>lpc.longpayload.simplerpc.server.LongPayload_SEI</service- endpoint-interface> <service-impl-bean> <servlet-link>lpc_longpayload_simplerpc_server_LongPayload</servlet-link> </service-impl-bean> </port-component> </webservice-description> </webservices> /** * LongPayload_SEI.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.longpayload.simplerpc.server; public interface LongPayload_SEI extends java.rmi.Remote { public void run() throws java.rmi.RemoteException; public long getData() throws java.rmi.RemoteException; } 109
  • Michael Wong 151220 Return Multiple Bytes – Complex RPC webservicesclient.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE webservicesclient PUBLIC "-//IBM Corporation, Inc.//DTD J2EE Web services client 1.0//EN" "http://www.ibm.com/webservices/dtd/j2ee_web_services_client_1_0.dtd"> <webservicesclient> <service-ref> <description>WSDL Service BytePayloadComplex_SEIService</description> <service-ref-name>service/BytePayloadComplex_SEIService</service-ref-name> <service- interface>lpc.bytepayload.complexrpc.server.BytePayloadComplex_SEIService</service-interface> <wsdl-file>META-INF/BytePayloadComplex_SEI.wsdl</wsdl-file> <jaxrpc-mapping-file>META-INF/BytePayloadComplex_SEI_mapping.xml</jaxrpc-mapping-file> <port-component-ref> <service-endpoint- interface>lpc.bytepayload.complexrpc.server.BytePayloadComplex_SEI</service-endpoint-interface> </port-component-ref> </service-ref> </webservicesclient> webservices.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE webservices PUBLIC "-//IBM Corporation, Inc.//DTD J2EE Web services 1.0//EN" "http://www.ibm.com/webservices/dtd/j2ee_web_services_1_0.dtd"> <webservices> <webservice-description> <webservice-description-name>BytePayloadComplex_SEIService</webservice-description- name> <wsdl-file>WEB-INF/BytePayloadComplex_SEI.wsdl</wsdl-file> <jaxrpc-mapping-file>WEB-INF/BytePayloadComplex_SEI_mapping.xml</jaxrpc-mapping- file> <port-component> <port-component-name>BytePayloadComplex</port-component-name> <wsdl-port> <namespaceURI>http://server.complexrpc.bytepayload.lpc</namespaceURI> <localpart>BytePayloadComplex</localpart> </wsdl-port> <service-endpoint- interface>lpc.bytepayload.complexrpc.server.BytePayloadComplex_SEI</service-endpoint-interface> <service-impl-bean> <servlet-link>lpc_bytepayload_complexrpc_server_BytePayloadComplex</servlet-link> </service-impl-bean> </port-component> </webservice-description> </webservices> ibm-webservicesclient.xml <?xml version="1.0" encoding="UTF-8"?> <clientbinding> <!-- Add security information here if necessary --> </clientbinding> ibm-webservices-bnd.xml <?xml version="1.0" encoding="UTF-8"?> <wsbinding> <ws-desc-binding ws-desc-name-link="BytePayloadComplex_SEIService"> <pc-binding pc-name-link="BytePayloadComplex"> </pc-binding> </ws-desc-binding> </wsbinding> /** 110
  • Michael Wong 151220 * BytePayloadComplexSoapBindingStub.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.bytepayload.complexrpc.server; public class BytePayloadComplexSoapBindingStub extends org.apache.axis.client.Stub implements lpc.bytepayload.complexrpc.server.BytePayloadComplex_SEI { private java.util.Vector cachedSerClasses = new java.util.Vector(); private java.util.Vector cachedSerQNames = new java.util.Vector(); private java.util.Vector cachedSerFactories = new java.util.Vector(); private java.util.Vector cachedDeserFactories = new java.util.Vector(); public BytePayloadComplexSoapBindingStub() throws org.apache.axis.AxisFault { this(null); } public BytePayloadComplexSoapBindingStub(java.net.URL endpointURL, javax.xml.rpc.Service service) throws org.apache.axis.AxisFault { this(service); super.cachedEndpoint = endpointURL; } public BytePayloadComplexSoapBindingStub(javax.xml.rpc.Service service) throws org.apache.axis.AxisFault { if (service == null) { super.service = new org.apache.axis.client.Service(); } else { super.service = service; } java.lang.Class cls; javax.xml.namespace.QName qName; java.lang.Class beansf = org.apache.axis.encoding.ser.BeanSerializerFactory.class; java.lang.Class beandf = org.apache.axis.encoding.ser.BeanDeserializerFactory.class; java.lang.Class enumsf = org.apache.axis.encoding.ser.EnumSerializerFactory.class; java.lang.Class enumdf = org.apache.axis.encoding.ser.EnumDeserializerFactory.class; java.lang.Class arraysf = org.apache.axis.encoding.ser.ArraySerializerFactory.class; java.lang.Class arraydf = org.apache.axis.encoding.ser.ArrayDeserializerFactory.class; java.lang.Class simplesf = org.apache.axis.encoding.ser.SimpleSerializerFactory.class; java.lang.Class simpledf = org.apache.axis.encoding.ser.SimpleDeserializerFactory.class; qName = new javax.xml.namespace.QName("http://service.complexrpc.bytepayload.lpc", "ByteObject"); cachedSerQNames.add(qName); cls = lpc.bytepayload.complexrpc.service.ByteObject.class; cachedSerClasses.add(cls); cachedSerFactories.add(beansf); cachedDeserFactories.add(beandf); } private org.apache.axis.client.Call createCall() throws java.rmi.RemoteException { try { org.apache.axis.client.Call _call = (org.apache.axis.client.Call) super.service.createCall(); if (super.maintainSessionSet) { _call.setMaintainSession(super.maintainSession); } if (super.cachedUsername != null) { _call.setUsername(super.cachedUsername); } if (super.cachedPassword != null) { _call.setPassword(super.cachedPassword); } if (super.cachedEndpoint != null) { _call.setTargetEndpointAddress(super.cachedEndpoint); } if (super.cachedTimeout != null) { _call.setTimeout(super.cachedTimeout); } 111
  • Michael Wong 151220 if (super.cachedPortName != null) { _call.setPortName(super.cachedPortName); } java.util.Enumeration keys = super.cachedProperties.keys(); while (keys.hasMoreElements()) { java.lang.String key = (java.lang.String) keys.nextElement(); _call.setProperty(key, super.cachedProperties.get(key)); } // All the type mapping information is registered // when the first call is made. // The type mapping information is actually registered in // the TypeMappingRegistry of the service, which // is the reason why registration is only needed for the first call. synchronized (this) { if (firstCall()) { // must set encoding style before registering serializers _call.setEncodingStyle(null); for (int i = 0; i < cachedSerFactories.size(); ++i) { java.lang.Class cls = (java.lang.Class) cachedSerClasses.get(i); javax.xml.namespace.QName qName = (javax.xml.namespace.QName) cachedSerQNames.get(i); java.lang.Class sf = (java.lang.Class) cachedSerFactories.get(i); java.lang.Class df = (java.lang.Class) cachedDeserFactories.get(i); _call.registerTypeMapping(cls, qName, sf, df, false); } } } return _call; } catch (java.lang.Throwable t) { throw new org.apache.axis.AxisFault("Failure trying to get the Call object", t); } } public void run() throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setReturnType(org.apache.axis.encoding.XMLType.AXIS_VOID); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setEncodingStyle(null); _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE); _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); _call.setOperationStyle("rpc"); _call.setOperationUse("literal"); _call.setOperationName(new javax.xml.namespace.QName("http://server.complexrpc.bytepayload.lpc", "run")); java.lang.Object _resp = _call.invoke(new java.lang.Object[] {}); if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } } public lpc.bytepayload.complexrpc.service.ByteObject getData() throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setReturnType(new javax.xml.namespace.QName("http://service.complexrpc.bytepayload.lpc", "ByteObject"), lpc.bytepayload.complexrpc.service.ByteObject.class); _call.setReturnQName(new javax.xml.namespace.QName("", "getDataReturn")); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); 112
  • Michael Wong 151220 _call.setEncodingStyle(null); _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE); _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); _call.setOperationStyle("rpc"); _call.setOperationUse("literal"); _call.setOperationName(new javax.xml.namespace.QName("http://server.complexrpc.bytepayload.lpc", "getData")); java.lang.Object _resp = _call.invoke(new java.lang.Object[] {}); if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } else { try { return (lpc.bytepayload.complexrpc.service.ByteObject) _resp; } catch (java.lang.Exception _exception) { return (lpc.bytepayload.complexrpc.service.ByteObject) org.apache.axis.utils.JavaUtils.convert(_resp, lpc.bytepayload.complexrpc.service.ByteObject.class); } } } } /* * Created on 23-Aug-2003 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ package lpc.bytepayload.complexrpc.client; import lpc.bytepayload.complexrpc.server.*; import lpc.bytepayload.complexrpc.service.*; import java.util.*; import java.io.*; /** * @author Administrator * * To change the template for this generated type comment go to * Window - Preferences - Java - Code Generation - Code and Comments */ public class BytePayloadComplexClient extends Thread { long timeStamp; String logEntry; Vector startPointTimestamps = new Vector(); Vector endPointTimestamps = new Vector(); int numOfRepetitions; //ScoreUpdate aScoreUpdate; public BytePayloadComplexClient(){ super(); //numOfRepetitions = Integer.parseInt(args); this.start(); } public void run(){ //System.out.println("started thread"); //disable any security settings that may be in place System.setSecurityManager(null); try { BytePayloadComplex_SEIService loc = new BytePayloadComplex_SEIServiceLocator(); 113
  • Michael Wong 151220 BytePayloadComplex_SEI port = (BytePayloadComplex_SEI)loc.getBytePayloadComplex(); for(int i=0; i <= numOfRepetitions; i++ ) { // timestamping START TIME makeLogEntry(startPointTimestamps); outputResults(port.getData()); //System.out.println(i + " number of calls to web service"); //log end point after each 'poll' makeLogEntry(endPointTimestamps); //sleep for 50ms before polling again - simulate JSB Thread.sleep(50); } }catch(Exception e){ System.out.println("RRHighPayloadClient exception" + e); } //end the testcase - write START TIMEs and END TIMEs to file endTestCase(); } public static void main(String[] args){ BytePayloadComplexClient aBytePayloadComplexClient = new BytePayloadComplexClient(); } public void makeLogEntry(Vector timestampLogs){ timeStamp = System.currentTimeMillis(); if(timestampLogs.equals(startPointTimestamps)) logEntry = timeStamp + " " + " STARTPOINT"; else{ //want to "pair" log entries - only increment counter if ENDPOINT logEntry = timeStamp + " " + " ENDPOINT"; } timestampLogs.add(logEntry); }//end makeLogEntry() private void writeResultsToFile(Vector timestampLogs, String filename){ //FileOutputStream fout; RandomAccessFile raf; System.setSecurityManager(null); String logEntry = ""; long filelength; String ENDL = System.getProperty("line.separator"); try{ //open a new output stream //fout = new FileOutputStream(filename); File f = new File(filename); //new RandomAccessFile raf = new RandomAccessFile(filename, "rw"); 114
  • Michael Wong 151220 //set up a loop to iterate through counter length //write each entry to file //ListIterator iter = timestampLogs.listIterator(); for(int i=0; i < timestampLogs.size(); i++){ logEntry = logEntry + " " + (String)timestampLogs.get(i) + ENDL; } //fout.close(); filelength = f.length(); raf.seek(filelength); raf.writeBytes(logEntry); raf.close(); }catch(IOException e){ System.err.println("Unable to print to file"); System.exit(-1); }//end try catch block }//end writeResultsToFile private void outputResults(ByteObject aByteObject){ //FileOutputStream fout; //PrintStream ps; RandomAccessFile raf; long filelength; String ENDL = System.getProperty("line.separator"); System.setSecurityManager(null); try{ //open a new output stream //new RandomAccessFile File f = new File("Received Bytes.txt"); raf = new RandomAccessFile(f, "rw"); filelength = f.length(); raf.seek(filelength); //2 return //raf.writeBytes(aByteObject.getByte1() + " " + aByteObject.getByte2()); //5 return //raf.writeBytes(aByteObject.getByte1() + " " + aByteObject.getByte2() //+ " " + aByteObject.getByte3() + " " + aByteObject.getByte4() + " " + //aByteObject.getByte5()); //10 return raf.writeBytes(aByteObject.getByte1() + " " + aByteObject.getByte2() + " " + aByteObject.getByte3() + " " + aByteObject.getByte4() + " " + aByteObject.getByte5() + aByteObject.getByte6() + " " + aByteObject.getByte7() + " " + aByteObject.getByte8() + " " + aByteObject.getByte9() + " " + aByteObject.getByte10()); raf.close(); //fout.close(); //ps.close(); }catch(IOException e){ System.err.println("Unable to print to file"); System.exit(-1); }//end try catch block }//end outputResults() 115
  • Michael Wong 151220 public void endTestCase(){ writeResultsToFile(startPointTimestamps, "BytePayloadStartPoint.txt"); writeResultsToFile(endPointTimestamps, "BytePayloadEndPoint.txt"); } } /* * Created on 23-Aug-2003 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ package lpc.bytepayload.complexrpc.service; /** * @author Administrator * * To change the template for this generated type comment go to * Window - Preferences - Java - Code Generation - Code and Comments */ public class ByteObject { private byte byte1 = Byte.MAX_VALUE; private byte byte2 = Byte.MAX_VALUE; private byte byte3 = Byte.MAX_VALUE; private byte byte4 = Byte.MAX_VALUE; private byte byte5 = Byte.MAX_VALUE; private byte byte6 = Byte.MAX_VALUE; private byte byte7 = Byte.MAX_VALUE; private byte byte8 = Byte.MAX_VALUE; private byte byte9 = Byte.MAX_VALUE; private byte byte10 = Byte.MAX_VALUE; public byte getByte10() { return byte10; } public void setByte10(byte byte10) { this.byte10 = byte10; } public byte getByte6() { return byte6; } public void setByte6(byte byte6) { this.byte6 = byte6; } public byte getByte7() { return byte7; } public void setByte7(byte byte7) { this.byte7 = byte7; } public byte getByte8() { return byte8; } public void setByte8(byte byte8) { this.byte8 = byte8; } public byte getByte9() { return byte9; } 116
  • Michael Wong 151220 public void setByte9(byte byte9) { this.byte9 = byte9; } public byte getByte3() { return byte3; } public void setByte3(byte byte3) { this.byte3 = byte3; } public byte getByte4() { return byte4; } public void setByte4(byte byte4) { this.byte4 = byte4; } public byte getByte5() { return byte5; } public void setByte5(byte byte5) { this.byte5 = byte5; } public byte getByte1() { return byte1; } /** * @param byte1 */ public void setByte1(byte byte1) { this.byte1 = byte1; } /** * @return */ public byte getByte2() { return byte2; } /** * @param byte2 */ public void setByte2(byte byte2) { this.byte2 = byte2; } public ByteObject(){ } } /** * BytePayloadComplex_SEIService.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.bytepayload.complexrpc.server; public interface BytePayloadComplex_SEIService extends javax.xml.rpc.Service { public java.lang.String getBytePayloadComplexAddress(); 117
  • Michael Wong 151220 public lpc.bytepayload.complexrpc.server.BytePayloadComplex_SEI getBytePayloadComplex() throws javax.xml.rpc.ServiceException; public lpc.bytepayload.complexrpc.server.BytePayloadComplex_SEI getBytePayloadComplex(java.net.URL portAddress) throws javax.xml.rpc.ServiceException; } BytePayloadComplex_SEI_mapping.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE java-wsdl-mapping PUBLIC "-//IBM Corporation, Inc.//DTD J2EE JAX-RPC mapping 1.0//EN" "http://www.ibm.com/webservices/dtd/j2ee_jaxrpc_mapping_1_0.dtd"> <java-wsdl-mapping> <package-mapping> <package-type>lpc.bytepayload.complexrpc.server</package-type> <namespaceURI>http://server.complexrpc.bytepayload.lpc</namespaceURI> </package-mapping> <package-mapping> <package-type>lpc.bytepayload.complexrpc.service</package-type> <namespaceURI>http://service.complexrpc.bytepayload.lpc</namespaceURI> </package-mapping> </java-wsdl-mapping> bytePayloadComplex_SEI.wsdl <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://server.complexrpc.bytepayload.lpc" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://server.complexrpc.bytepayload.lpc" xmlns:intf="http://server.complexrpc.bytepayload.lpc" xmlns:tns2="http://service.complexrpc.bytepayload.lpc" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:types> <schema targetNamespace="http://service.complexrpc.bytepayload.lpc" xmlns="http://www.w3.org/2001/XMLSchema"> <complexType name="ByteObject"> <sequence> <element name="byte2" type="xsd:byte"/> <element name="byte1" type="xsd:byte"/> </sequence> </complexType> <element name="ByteObject" nillable="true" type="tns2:ByteObject"/> </schema> </wsdl:types> <wsdl:message name="getDataRequest"> </wsdl:message> <wsdl:message name="getDataResponse"> <wsdl:part name="getDataReturn" type="tns2:ByteObject"/> </wsdl:message> <wsdl:message name="runResponse"> </wsdl:message> <wsdl:message name="runRequest"> </wsdl:message> <wsdl:portType name="BytePayloadComplex_SEI"> <wsdl:operation name="run"> <wsdl:input message="intf:runRequest" name="runRequest"/> <wsdl:output message="intf:runResponse" name="runResponse"/> 118
  • Michael Wong 151220 </wsdl:operation> <wsdl:operation name="getData"> <wsdl:input message="intf:getDataRequest" name="getDataRequest"/> <wsdl:output message="intf:getDataResponse" name="getDataResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="BytePayloadComplexSoapBinding" type="intf:BytePayloadComplex_SEI"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="run"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="runRequest"> <wsdlsoap:body namespace="http://server.complexrpc.bytepayload.lpc" use="literal"/> </wsdl:input> <wsdl:output name="runResponse"> <wsdlsoap:body namespace="http://server.complexrpc.bytepayload.lpc" use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getData"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="getDataRequest"> <wsdlsoap:body namespace="http://server.complexrpc.bytepayload.lpc" use="literal"/> </wsdl:input> <wsdl:output name="getDataResponse"> <wsdlsoap:body namespace="http://server.complexrpc.bytepayload.lpc" use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="BytePayloadComplex_SEIService"> <wsdl:port binding="intf:BytePayloadComplexSoapBinding" name="BytePayloadComplex"> <wsdlsoap:address location="http://localhost:6080/returnByteComplex/services/BytePayloadComplex"/> </wsdl:port> </wsdl:service> </wsdl:definitions> /** * BytePayloadComplex_SEI.java * 119
  • Michael Wong 151220 * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.bytepayload.complexrpc.server; public interface BytePayloadComplex_SEI extends java.rmi.Remote { public void run() throws java.rmi.RemoteException; public lpc.bytepayload.complexrpc.service.ByteObject getData() throws java.rmi.RemoteException; } /* * Created on 23-Aug-2003 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ package lpc.bytepayload.complexrpc.server; import lpc.bytepayload.complexrpc.client.*; import lpc.bytepayload.complexrpc.service.*; import java.rmi.Remote; import java.rmi.RemoteException; /** * @author Administrator * * To change the template for this generated type comment go to * Window - Preferences - Java - Code Generation - Code and Comments */ public class BytePayloadComplex extends Thread implements java.rmi.Remote{ public ByteObject getData() throws java.rmi.RemoteException{ return new ByteObject(); } public void run(){ setDaemon(true); } } /** * BytePayloadComplex_SEIServiceLocator.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.bytepayload.complexrpc.server; public class BytePayloadComplex_SEIServiceLocator extends org.apache.axis.client.Service implements lpc.bytepayload.complexrpc.server.BytePayloadComplex_SEIService { // Use to get a proxy class for BytePayloadComplex private final java.lang.String BytePayloadComplex_address = "http://10.10.0.1:6080/returnByteComplex/services/BytePayloadComplex"; public java.lang.String getBytePayloadComplexAddress() { return BytePayloadComplex_address; } // The WSDD service name defaults to the port name. private java.lang.String BytePayloadComplexWSDDServiceName = "BytePayloadComplex"; public java.lang.String getBytePayloadComplexWSDDServiceName() { return BytePayloadComplexWSDDServiceName; } public void setBytePayloadComplexWSDDServiceName(java.lang.String name) { 120
  • Michael Wong 151220 BytePayloadComplexWSDDServiceName = name; } public lpc.bytepayload.complexrpc.server.BytePayloadComplex_SEI getBytePayloadComplex() throws javax.xml.rpc.ServiceException { java.net.URL endpoint; try { endpoint = new java.net.URL(BytePayloadComplex_address); } catch (java.net.MalformedURLException e) { return null; // unlikely as URL was validated in WSDL2Java } return getBytePayloadComplex(endpoint); } public lpc.bytepayload.complexrpc.server.BytePayloadComplex_SEI getBytePayloadComplex(java.net.URL portAddress) throws javax.xml.rpc.ServiceException { try { lpc.bytepayload.complexrpc.server.BytePayloadComplexSoapBindingStub _stub = new lpc.bytepayload.complexrpc.server.BytePayloadComplexSoapBindingStub(portAddress, this); _stub.setPortName(getBytePayloadComplexWSDDServiceName()); return _stub; } catch (org.apache.axis.AxisFault e) { return null; } } /** * For the given interface, get the stub implementation. * If this service has no port for the given interface, * then ServiceException is thrown. */ public java.rmi.Remote getPort(Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException { try { if (lpc.bytepayload.complexrpc.server.BytePayloadComplex_SEI.class.isAssignableFrom(serviceEndpoint Interface)) { lpc.bytepayload.complexrpc.server.BytePayloadComplexSoapBindingStub _stub = new lpc.bytepayload.complexrpc.server.BytePayloadComplexSoapBindingStub(new java.net.URL(BytePayloadComplex_address), this); _stub.setPortName(getBytePayloadComplexWSDDServiceName()); return _stub; } } catch (java.lang.Throwable t) { throw new javax.xml.rpc.ServiceException(t); } throw new javax.xml.rpc.ServiceException("There is no stub implementation for the interface: " + (serviceEndpointInterface == null ? "null" : serviceEndpointInterface.getName())); } /** * For the given interface, get the stub implementation. * If this service has no port for the given interface, * then ServiceException is thrown. */ public java.rmi.Remote getPort(javax.xml.namespace.QName portName, Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException { if (portName == null) { return getPort(serviceEndpointInterface); } String inputPortName = portName.getLocalPart(); if ("BytePayloadComplex".equals(inputPortName)) { return getBytePayloadComplex(); } else { java.rmi.Remote _stub = getPort(serviceEndpointInterface); ((org.apache.axis.client.Stub) _stub).setPortName(portName); return _stub; 121
  • Michael Wong 151220 } } public javax.xml.namespace.QName getServiceName() { return new javax.xml.namespace.QName("http://server.complexrpc.bytepayload.lpc", "BytePayloadComplex_SEIService"); } private java.util.HashSet ports = null; public java.util.Iterator getPorts() { if (ports == null) { ports = new java.util.HashSet(); ports.add(new javax.xml.namespace.QName("BytePayloadComplex")); } return ports.iterator(); } } 122
  • Michael Wong 151220 One Way – simple RPC webservicesclient.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE webservicesclient PUBLIC "-//IBM Corporation, Inc.//DTD J2EE Web services client 1.0//EN" "http://www.ibm.com/webservices/dtd/j2ee_web_services_client_1_0.dtd"> <webservicesclient> <service-ref> <description>WSDL Service OneWay_SEIService</description> <service-ref-name>service/OneWay_SEIService</service-ref-name> <service-interface>lpc.oneway.simplerpc.server.OneWay_SEIService</service-interface> <wsdl-file>META-INF/OneWay_SEI.wsdl</wsdl-file> <jaxrpc-mapping-file>META-INF/OneWay_SEI_mapping.xml</jaxrpc-mapping-file> <port-component-ref> <service-endpoint-interface>lpc.oneway.simplerpc.server.OneWay_SEI</service-endpoint- interface> </port-component-ref> </service-ref> </webservicesclient> webservices.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE webservices PUBLIC "-//IBM Corporation, Inc.//DTD J2EE Web services 1.0//EN" "http://www.ibm.com/webservices/dtd/j2ee_web_services_1_0.dtd"> <webservices> <webservice-description> <webservice-description-name>OneWay_SEIService</webservice-description-name> <wsdl-file>WEB-INF/OneWay_SEI.wsdl</wsdl-file> <jaxrpc-mapping-file>WEB-INF/OneWay_SEI_mapping.xml</jaxrpc-mapping-file> <port-component> <port-component-name>OneWay</port-component-name> <wsdl-port> <namespaceURI>http://server.simplerpc.oneway.lpc</namespaceURI> <localpart>OneWay</localpart> </wsdl-port> <service-endpoint-interface>lpc.oneway.simplerpc.server.OneWay_SEI</service-endpoint- interface> <service-impl-bean> <servlet-link>lpc_oneway_simplerpc_server_OneWay</servlet-link> </service-impl-bean> </port-component> </webservice-description> </webservices> OneWaySoapBindingStub.java /** * OneWaySoapBindingStub.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.oneway.simplerpc.server; public class OneWaySoapBindingStub extends org.apache.axis.client.Stub implements lpc.oneway.simplerpc.server.OneWay_SEI { private java.util.Vector cachedSerClasses = new java.util.Vector(); private java.util.Vector cachedSerQNames = new java.util.Vector(); private java.util.Vector cachedSerFactories = new java.util.Vector(); private java.util.Vector cachedDeserFactories = new java.util.Vector(); public OneWaySoapBindingStub() throws org.apache.axis.AxisFault { this(null); } public OneWaySoapBindingStub(java.net.URL endpointURL, javax.xml.rpc.Service service) throws org.apache.axis.AxisFault { this(service); 123
  • Michael Wong 151220 super.cachedEndpoint = endpointURL; } public OneWaySoapBindingStub(javax.xml.rpc.Service service) throws org.apache.axis.AxisFault { if (service == null) { super.service = new org.apache.axis.client.Service(); } else { super.service = service; } } private org.apache.axis.client.Call createCall() throws java.rmi.RemoteException { try { org.apache.axis.client.Call _call = (org.apache.axis.client.Call) super.service.createCall(); if (super.maintainSessionSet) { _call.setMaintainSession(super.maintainSession); } if (super.cachedUsername != null) { _call.setUsername(super.cachedUsername); } if (super.cachedPassword != null) { _call.setPassword(super.cachedPassword); } if (super.cachedEndpoint != null) { _call.setTargetEndpointAddress(super.cachedEndpoint); } if (super.cachedTimeout != null) { _call.setTimeout(super.cachedTimeout); } if (super.cachedPortName != null) { _call.setPortName(super.cachedPortName); } java.util.Enumeration keys = super.cachedProperties.keys(); while (keys.hasMoreElements()) { java.lang.String key = (java.lang.String) keys.nextElement(); _call.setProperty(key, super.cachedProperties.get(key)); } return _call; } catch (java.lang.Throwable t) { throw new org.apache.axis.AxisFault("Failure trying to get the Call object", t); } } public void makeLogEntry() throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setReturnType(org.apache.axis.encoding.XMLType.AXIS_VOID); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setEncodingStyle(null); _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE); _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); _call.setOperationStyle("rpc"); _call.setOperationUse("literal"); _call.setOperationName(new javax.xml.namespace.QName("http://server.simplerpc.oneway.lpc", "makeLogEntry")); java.lang.Object _resp = _call.invoke(new java.lang.Object[] {}); if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } } public java.util.Vector makeRequest() throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); 124
  • Michael Wong 151220 } org.apache.axis.client.Call _call = createCall(); _call.setReturnType(new javax.xml.namespace.QName("http://xml.apache.org/xml-soap", "Vector"), java.util.Vector.class); _call.setReturnQName(new javax.xml.namespace.QName("", "makeRequestReturn")); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setEncodingStyle(null); _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE); _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); _call.setOperationStyle("rpc"); _call.setOperationUse("literal"); _call.setOperationName(new javax.xml.namespace.QName("http://server.simplerpc.oneway.lpc", "makeRequest")); java.lang.Object _resp = _call.invoke(new java.lang.Object[] {}); if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } else { try { return (java.util.Vector) _resp; } catch (java.lang.Exception _exception) { return (java.util.Vector) org.apache.axis.utils.JavaUtils.convert(_resp, java.util.Vector.class); } } } } /** * OneWay_SEIServiceLocator.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.oneway.simplerpc.server; public class OneWay_SEIServiceLocator extends org.apache.axis.client.Service implements lpc.oneway.simplerpc.server.OneWay_SEIService { // Use to get a proxy class for OneWay private final java.lang.String OneWay_address = "http://localhost:6080/SimpleRPC1/services/OneWay"; public java.lang.String getOneWayAddress() { return OneWay_address; } // The WSDD service name defaults to the port name. private java.lang.String OneWayWSDDServiceName = "OneWay"; public java.lang.String getOneWayWSDDServiceName() { return OneWayWSDDServiceName; } public void setOneWayWSDDServiceName(java.lang.String name) { OneWayWSDDServiceName = name; } public lpc.oneway.simplerpc.server.OneWay_SEI getOneWay() throws javax.xml.rpc.ServiceException { java.net.URL endpoint; try { endpoint = new java.net.URL(OneWay_address); } catch (java.net.MalformedURLException e) { return null; // unlikely as URL was validated in WSDL2Java 125
  • Michael Wong 151220 } return getOneWay(endpoint); } public lpc.oneway.simplerpc.server.OneWay_SEI getOneWay(java.net.URL portAddress) throws javax.xml.rpc.ServiceException { try { lpc.oneway.simplerpc.server.OneWaySoapBindingStub _stub = new lpc.oneway.simplerpc.server.OneWaySoapBindingStub(portAddress, this); _stub.setPortName(getOneWayWSDDServiceName()); return _stub; } catch (org.apache.axis.AxisFault e) { return null; } } /** * For the given interface, get the stub implementation. * If this service has no port for the given interface, * then ServiceException is thrown. */ public java.rmi.Remote getPort(Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException { try { if (lpc.oneway.simplerpc.server.OneWay_SEI.class.isAssignableFrom(serviceEndpointInterface)) { lpc.oneway.simplerpc.server.OneWaySoapBindingStub _stub = new lpc.oneway.simplerpc.server.OneWaySoapBindingStub(new java.net.URL(OneWay_address), this); _stub.setPortName(getOneWayWSDDServiceName()); return _stub; } } catch (java.lang.Throwable t) { throw new javax.xml.rpc.ServiceException(t); } throw new javax.xml.rpc.ServiceException("There is no stub implementation for the interface: " + (serviceEndpointInterface == null ? "null" : serviceEndpointInterface.getName())); } /** * For the given interface, get the stub implementation. * If this service has no port for the given interface, * then ServiceException is thrown. */ public java.rmi.Remote getPort(javax.xml.namespace.QName portName, Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException { if (portName == null) { return getPort(serviceEndpointInterface); } String inputPortName = portName.getLocalPart(); if ("OneWay".equals(inputPortName)) { return getOneWay(); } else { java.rmi.Remote _stub = getPort(serviceEndpointInterface); ((org.apache.axis.client.Stub) _stub).setPortName(portName); return _stub; } } public javax.xml.namespace.QName getServiceName() { return new javax.xml.namespace.QName("http://server.simplerpc.oneway.lpc", "OneWay_SEIService"); } private java.util.HashSet ports = null; public java.util.Iterator getPorts() { if (ports == null) { ports = new java.util.HashSet(); 126
  • Michael Wong 151220 ports.add(new javax.xml.namespace.QName("OneWay")); } return ports.iterator(); } } /** * OneWay_SEIService.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.oneway.simplerpc.server; public interface OneWay_SEIService extends javax.xml.rpc.Service { public java.lang.String getOneWayAddress(); public lpc.oneway.simplerpc.server.OneWay_SEI getOneWay() throws javax.xml.rpc.ServiceException; public lpc.oneway.simplerpc.server.OneWay_SEI getOneWay(java.net.URL portAddress) throws javax.xml.rpc.ServiceException; } OneWay_SEI_mapping.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE java-wsdl-mapping PUBLIC "-//IBM Corporation, Inc.//DTD J2EE JAX-RPC mapping 1.0//EN" "http://www.ibm.com/webservices/dtd/j2ee_jaxrpc_mapping_1_0.dtd"> <java-wsdl-mapping> <package-mapping> <package-type>lpc.oneway.simplerpc.server</package-type> <namespaceURI>http://server.simplerpc.oneway.lpc</namespaceURI> </package-mapping> </java-wsdl-mapping> /** * OneWay_SEI.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.oneway.simplerpc.server; public interface OneWay_SEI extends java.rmi.Remote { public void makeLogEntry() throws java.rmi.RemoteException; public java.util.Vector makeRequest() throws java.rmi.RemoteException; } OneWay_SEI.wsdl <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://server.simplerpc.oneway.lpc" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://server.simplerpc.oneway.lpc" xmlns:intf="http://server.simplerpc.oneway.lpc" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:types> <schema targetNamespace="http://xml.apache.org/xml-soap" xmlns="http://www.w3.org/2001/XMLSchema"> <complexType name="Vector"> <sequence> <element maxOccurs="unbounded" minOccurs="0" name="item" type="xsd:anyType"/> </sequence> </complexType> <element name="Vector" nillable="true" type="apachesoap:Vector"/> </schema> </wsdl:types> 127
  • Michael Wong 151220 <wsdl:message name="makeRequestResponse"> <wsdl:part name="makeRequestReturn" type="apachesoap:Vector"/> </wsdl:message> <wsdl:message name="makeLogEntryRequest"> </wsdl:message> <wsdl:message name="makeRequestRequest"> </wsdl:message> <wsdl:message name="makeLogEntryResponse"> </wsdl:message> <wsdl:portType name="OneWay_SEI"> <wsdl:operation name="makeLogEntry"> <wsdl:input message="intf:makeLogEntryRequest" name="makeLogEntryRequest"/> <wsdl:output message="intf:makeLogEntryResponse" name="makeLogEntryResponse"/> </wsdl:operation> <wsdl:operation name="makeRequest"> <wsdl:input message="intf:makeRequestRequest" name="makeRequestRequest"/> <wsdl:output message="intf:makeRequestResponse" name="makeRequestResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="OneWaySoapBinding" type="intf:OneWay_SEI"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="makeLogEntry"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="makeLogEntryRequest"> <wsdlsoap:body namespace="http://server.simplerpc.oneway.lpc" use="literal"/> </wsdl:input> <wsdl:output name="makeLogEntryResponse"> <wsdlsoap:body namespace="http://server.simplerpc.oneway.lpc" use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="makeRequest"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="makeRequestRequest"> <wsdlsoap:body namespace="http://server.simplerpc.oneway.lpc" use="literal"/> </wsdl:input> <wsdl:output name="makeRequestResponse"> 128
  • Michael Wong 151220 <wsdlsoap:body namespace="http://server.simplerpc.oneway.lpc" use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="OneWay_SEIService"> <wsdl:port binding="intf:OneWaySoapBinding" name="OneWay"> <wsdlsoap:address location="http://localhost:6080/SimpleRPC1/services/OneWay"/> </wsdl:port> </wsdl:service> </wsdl:definitions> /* * Created on 14-Aug-2003 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ package lpc.oneway.simplerpc.server; import java.util.*; public class OneWay implements java.rmi.Remote{ Vector timestamps = new Vector(); String logEntry; long endTime; int counter = 0; //ENDPOINT log entry public void makeLogEntry(){ counter++; endTime = System.currentTimeMillis(); logEntry = counter + " - " + endTime + " ENDPOINT"; timestamps.add(logEntry); }//end makeLogEntry() public Vector makeRequest() throws java.rmi.RemoteException{ makeLogEntry(); return timestamps; }//end makeRequest() }//end OneWay class ibm-webservicesclient-bnd.xml <?xml version="1.0" encoding="UTF-8"?> <clientbinding> <!-- Add security information here if necessary --> </clientbinding> ibm-webservices-bnd.xml <?xml version="1.0" encoding="UTF-8"?> <wsbinding> <ws-desc-binding ws-desc-name-link="OneWay_SEIService"> <pc-binding pc-name-link="OneWay"> </pc-binding> </ws-desc-binding> 129
  • Michael Wong 151220 </wsbinding> Collect and Update (High Payload) - ComplexRPC4 /** * RRHighPayloadSoapBindingStub.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.rrhighpayload.complexrpc.server; public class RRHighPayloadSoapBindingStub extends org.apache.axis.client.Stub implements lpc.rrhighpayload.complexrpc.server.RRHighPayload_SEI { private java.util.Vector cachedSerClasses = new java.util.Vector(); private java.util.Vector cachedSerQNames = new java.util.Vector(); private java.util.Vector cachedSerFactories = new java.util.Vector(); private java.util.Vector cachedDeserFactories = new java.util.Vector(); public RRHighPayloadSoapBindingStub() throws org.apache.axis.AxisFault { this(null); } public RRHighPayloadSoapBindingStub(java.net.URL endpointURL, javax.xml.rpc.Service service) throws org.apache.axis.AxisFault { this(service); super.cachedEndpoint = endpointURL; } public RRHighPayloadSoapBindingStub(javax.xml.rpc.Service service) throws org.apache.axis.AxisFault { if (service == null) { super.service = new org.apache.axis.client.Service(); } else { super.service = service; } java.lang.Class cls; javax.xml.namespace.QName qName; java.lang.Class beansf = org.apache.axis.encoding.ser.BeanSerializerFactory.class; java.lang.Class beandf = org.apache.axis.encoding.ser.BeanDeserializerFactory.class; java.lang.Class enumsf = org.apache.axis.encoding.ser.EnumSerializerFactory.class; java.lang.Class enumdf = org.apache.axis.encoding.ser.EnumDeserializerFactory.class; java.lang.Class arraysf = org.apache.axis.encoding.ser.ArraySerializerFactory.class; java.lang.Class arraydf = org.apache.axis.encoding.ser.ArrayDeserializerFactory.class; java.lang.Class simplesf = org.apache.axis.encoding.ser.SimpleSerializerFactory.class; java.lang.Class simpledf = org.apache.axis.encoding.ser.SimpleDeserializerFactory.class; qName = new javax.xml.namespace.QName("http://service.complexrpc.rrhighpayload.lpc", "ScoreUpdate"); cachedSerQNames.add(qName); cls = lpc.rrhighpayload.complexrpc.service.ScoreUpdate.class; cachedSerClasses.add(cls); cachedSerFactories.add(beansf); cachedDeserFactories.add(beandf); } private org.apache.axis.client.Call createCall() throws java.rmi.RemoteException { try { org.apache.axis.client.Call _call = (org.apache.axis.client.Call) super.service.createCall(); if (super.maintainSessionSet) { _call.setMaintainSession(super.maintainSession); } if (super.cachedUsername != null) { _call.setUsername(super.cachedUsername); } if (super.cachedPassword != null) { _call.setPassword(super.cachedPassword); } 130
  • Michael Wong 151220 if (super.cachedEndpoint != null) { _call.setTargetEndpointAddress(super.cachedEndpoint); } if (super.cachedTimeout != null) { _call.setTimeout(super.cachedTimeout); } if (super.cachedPortName != null) { _call.setPortName(super.cachedPortName); } java.util.Enumeration keys = super.cachedProperties.keys(); while (keys.hasMoreElements()) { java.lang.String key = (java.lang.String) keys.nextElement(); _call.setProperty(key, super.cachedProperties.get(key)); } // All the type mapping information is registered // when the first call is made. // The type mapping information is actually registered in // the TypeMappingRegistry of the service, which // is the reason why registration is only needed for the first call. synchronized (this) { if (firstCall()) { // must set encoding style before registering serializers _call.setEncodingStyle(null); for (int i = 0; i < cachedSerFactories.size(); ++i) { java.lang.Class cls = (java.lang.Class) cachedSerClasses.get(i); javax.xml.namespace.QName qName = (javax.xml.namespace.QName) cachedSerQNames.get(i); java.lang.Class sf = (java.lang.Class) cachedSerFactories.get(i); java.lang.Class df = (java.lang.Class) cachedDeserFactories.get(i); _call.registerTypeMapping(cls, qName, sf, df, false); } } } return _call; } catch (java.lang.Throwable t) { throw new org.apache.axis.AxisFault("Failure trying to get the Call object", t); } } public void run() throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setReturnType(org.apache.axis.encoding.XMLType.AXIS_VOID); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setEncodingStyle(null); _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE); _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); _call.setOperationStyle("rpc"); _call.setOperationUse("literal"); _call.setOperationName(new javax.xml.namespace.QName("http://server.complexrpc.rrhighpayload.lpc", "run")); java.lang.Object _resp = _call.invoke(new java.lang.Object[] {}); if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } } public lpc.rrhighpayload.complexrpc.service.ScoreUpdate makeRequest(int i) throws java.rmi.RemoteException { if (super.cachedEndpoint == null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); 131
  • Michael Wong 151220 _call.addParameter(new javax.xml.namespace.QName("", "i"), new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"), int.class, javax.xml.rpc.ParameterMode.IN); _call.setReturnType(new javax.xml.namespace.QName("http://service.complexrpc.rrhighpayload.lpc", "ScoreUpdate"), lpc.rrhighpayload.complexrpc.service.ScoreUpdate.class); _call.setReturnQName(new javax.xml.namespace.QName("", "makeRequestReturn")); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setEncodingStyle(null); _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE); _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE); _call.setOperationStyle("rpc"); _call.setOperationUse("literal"); _call.setOperationName(new javax.xml.namespace.QName("http://server.complexrpc.rrhighpayload.lpc", "makeRequest")); java.lang.Object _resp = _call.invoke(new java.lang.Object[] {new java.lang.Integer(i)}); if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } else { try { return (lpc.rrhighpayload.complexrpc.service.ScoreUpdate) _resp; } catch (java.lang.Exception _exception) { return (lpc.rrhighpayload.complexrpc.service.ScoreUpdate) org.apache.axis.utils.JavaUtils.convert(_resp, lpc.rrhighpayload.complexrpc.service.ScoreUpdate.class); } } } } /** * RRHighPayload_SEIServiceLocator.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.rrhighpayload.complexrpc.server; public class RRHighPayload_SEIServiceLocator extends org.apache.axis.client.Service implements lpc.rrhighpayload.complexrpc.server.RRHighPayload_SEIService { // Use to get a proxy class for RRHighPayload private final java.lang.String RRHighPayload_address = "http://10.10.0.1:6080/ComplexRPC4/services/RRHighPayload"; public java.lang.String getRRHighPayloadAddress() { return RRHighPayload_address; } // The WSDD service name defaults to the port name. private java.lang.String RRHighPayloadWSDDServiceName = "RRHighPayload"; public java.lang.String getRRHighPayloadWSDDServiceName() { return RRHighPayloadWSDDServiceName; } public void setRRHighPayloadWSDDServiceName(java.lang.String name) { RRHighPayloadWSDDServiceName = name; } public lpc.rrhighpayload.complexrpc.server.RRHighPayload_SEI getRRHighPayload() throws javax.xml.rpc.ServiceException { java.net.URL endpoint; try { endpoint = new java.net.URL(RRHighPayload_address); 132
  • Michael Wong 151220 } catch (java.net.MalformedURLException e) { return null; // unlikely as URL was validated in WSDL2Java } return getRRHighPayload(endpoint); } public lpc.rrhighpayload.complexrpc.server.RRHighPayload_SEI getRRHighPayload(java.net.URL portAddress) throws javax.xml.rpc.ServiceException { try { lpc.rrhighpayload.complexrpc.server.RRHighPayloadSoapBindingStub _stub = new lpc.rrhighpayload.complexrpc.server.RRHighPayloadSoapBindingStub(portAddress, this); _stub.setPortName(getRRHighPayloadWSDDServiceName()); return _stub; } catch (org.apache.axis.AxisFault e) { return null; } } /** * For the given interface, get the stub implementation. * If this service has no port for the given interface, * then ServiceException is thrown. */ public java.rmi.Remote getPort(Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException { try { if (lpc.rrhighpayload.complexrpc.server.RRHighPayload_SEI.class.isAssignableFrom(serviceEndpointInter face)) { lpc.rrhighpayload.complexrpc.server.RRHighPayloadSoapBindingStub _stub = new lpc.rrhighpayload.complexrpc.server.RRHighPayloadSoapBindingStub(new java.net.URL(RRHighPayload_address), this); _stub.setPortName(getRRHighPayloadWSDDServiceName()); return _stub; } } catch (java.lang.Throwable t) { throw new javax.xml.rpc.ServiceException(t); } throw new javax.xml.rpc.ServiceException("There is no stub implementation for the interface: " + (serviceEndpointInterface == null ? "null" : serviceEndpointInterface.getName())); } /** * For the given interface, get the stub implementation. * If this service has no port for the given interface, * then ServiceException is thrown. */ public java.rmi.Remote getPort(javax.xml.namespace.QName portName, Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException { if (portName == null) { return getPort(serviceEndpointInterface); } String inputPortName = portName.getLocalPart(); if ("RRHighPayload".equals(inputPortName)) { return getRRHighPayload(); } else { java.rmi.Remote _stub = getPort(serviceEndpointInterface); ((org.apache.axis.client.Stub) _stub).setPortName(portName); return _stub; } } public javax.xml.namespace.QName getServiceName() { return new javax.xml.namespace.QName("http://server.complexrpc.rrhighpayload.lpc", "RRHighPayload_SEIService"); } 133
  • Michael Wong 151220 private java.util.HashSet ports = null; public java.util.Iterator getPorts() { if (ports == null) { ports = new java.util.HashSet(); ports.add(new javax.xml.namespace.QName("RRHighPayload")); } return ports.iterator(); } } /** * RRHighPayload_SEIService.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.rrhighpayload.complexrpc.server; public interface RRHighPayload_SEIService extends javax.xml.rpc.Service { public java.lang.String getRRHighPayloadAddress(); public lpc.rrhighpayload.complexrpc.server.RRHighPayload_SEI getRRHighPayload() throws javax.xml.rpc.ServiceException; public lpc.rrhighpayload.complexrpc.server.RRHighPayload_SEI getRRHighPayload(java.net.URL portAddress) throws javax.xml.rpc.ServiceException; } WebServicesClient.XML <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE webservicesclient PUBLIC "-//IBM Corporation, Inc.//DTD J2EE Web services client 1.0//EN" "http://www.ibm.com/webservices/dtd/j2ee_web_services_client_1_0.dtd"> <webservicesclient> <service-ref> <description>WSDL Service RRHighPayload_SEIService</description> <service-ref-name>service/RRHighPayload_SEIService</service-ref-name> <service- interface>lpc.rrhighpayload.complexrpc.server.RRHighPayload_SEIService</service-interface> <wsdl-file>META-INF/RRHighPayload_SEI.wsdl</wsdl-file> <jaxrpc-mapping-file>META-INF/RRHighPayload_SEI_mapping.xml</jaxrpc-mapping-file> <port-component-ref> <service-endpoint-interface>lpc.rrhighpayload.complexrpc.server.RRHighPayload_SEI</service- endpoint-interface> </port-component-ref> </service-ref> </webservicesclient> ibm-webservicesclient-bnd.xml <?xml version="1.0" encoding="UTF-8"?> <clientbinding> <!-- Add security information here if necessary --> </clientbinding> /** * ScoreUpdate_Ser.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.rrhighpayload.complexrpc.service; public class ScoreUpdate_Ser extends org.apache.axis.encoding.ser.BeanSerializer { /** * Constructor */ public ScoreUpdate_Ser( java.lang.Class _javaType, 134
  • Michael Wong 151220 javax.xml.namespace.QName _xmlType, org.apache.axis.description.TypeDesc _typeDesc) { super(_javaType, _xmlType, _typeDesc); } public void serialize( javax.xml.namespace.QName name, org.xml.sax.Attributes attributes, java.lang.Object value, org.apache.axis.encoding.SerializationContext context) throws java.io.IOException { context.startElement(name, addAttributes(attributes,value,context)); addElements(value,context); context.endElement(); } protected org.xml.sax.Attributes addAttributes( org.xml.sax.Attributes attributes, java.lang.Object value, org.apache.axis.encoding.SerializationContext context) throws java.io.IOException { return attributes; } protected void addElements( java.lang.Object value, org.apache.axis.encoding.SerializationContext context) throws java.io.IOException { ScoreUpdate bean = (ScoreUpdate) value; java.lang.Object propValue; javax.xml.namespace.QName propQName; { propQName = QName_0_0; propValue = bean.getPlayer2B_Atp(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_1; propValue = new Integer(bean.getSet_4_2()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_2; propValue = new Integer(bean.getSet_4_1()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_3; propValue = bean.getGame_2(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_4; propValue = bean.getGame_1(); if (propValue!= null) { 135
  • Michael Wong 151220 context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_5; propValue = bean.getIs_Tiebreak(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_6; propValue = bean.getPlayer1B(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_7; propValue = bean.getPlayer1A(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_8; propValue = new Integer(bean.getSet_3_2()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_9; propValue = new Integer(bean.getSet_3_1()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_10; propValue = new Integer(bean.getTiebreaker_5_2()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_11; propValue = new Integer(bean.getTiebreaker_5_1()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_12; propValue = new Integer(bean.getCurrent_Server()); 136
  • Michael Wong 151220 context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_13; propValue = new Integer(bean.getSet_2_2()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_14; propValue = new Integer(bean.getLast_Serv_Speed()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_15; propValue = new Integer(bean.getSet_2_1()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_16; propValue = new Integer(bean.getTiebreaker_4_2()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_17; propValue = new Integer(bean.getTiebreaker_4_1()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_18; propValue = bean.getPlayer2A_Atp(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_19; propValue = new Integer(bean.getSet_1_2()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_20; propValue = new Integer(bean.getSet_1_1()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_21; propValue = new Integer(bean.getTiebreaker_3_2()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_22; propValue = new Integer(bean.getTiebreaker_3_1()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_23; 137
  • Michael Wong 151220 propValue = new Integer(bean.getCourt_Id()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_24; propValue = bean.getEvent_Id(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_25; propValue = bean.getPlayer1B_Atp(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_26; propValue = bean.getStatus(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_27; propValue = new Integer(bean.getTiebreaker_2_2()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_28; propValue = new Integer(bean.getTiebreaker_2_1()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_29; propValue = bean.getNoNewNotifier(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_30; propValue = new Integer(bean.getTiebreaker_1_2()); context.serialize(propQName, null, propValue, QName_1_41, true,null); 138
  • Michael Wong 151220 propQName = QName_0_31; propValue = new Integer(bean.getTiebreaker_1_1()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_32; propValue = new Integer(bean.getCurrent_Set()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_33; propValue = bean.getPlayer1A_Atp(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_34; propValue = bean.getRound(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_35; propValue = bean.getPlayer2B(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_36; propValue = bean.getPlayer2A(); if (propValue!= null) { context.startElement(propQName, null); context.writeSafeString(propValue.toString()); context.endElement(); } else { context.serialize(propQName, null, propValue, QName_1_40, true,null); } propQName = QName_0_37; propValue = new Integer(bean.getMatch_Id()); context.serialize(propQName, null, propValue, QName_1_41, true,null); propQName = QName_0_38; propValue = new Integer(bean.getSet_5_2()); context.serialize(propQName, null, propValue, QName_1_41, 139
  • Michael Wong 151220 true,null); propQName = QName_0_39; propValue = new Integer(bean.getSet_5_1()); context.serialize(propQName, null, propValue, QName_1_41, true,null); } } public final static javax.xml.namespace.QName QName_0_0 = new javax.xml.namespace.QName( "", "player2b_atp"); public final static javax.xml.namespace.QName QName_0_1 = new javax.xml.namespace.QName( "", "set_4_2"); public final static javax.xml.namespace.QName QName_0_2 = new javax.xml.namespace.QName( "", "set_4_1"); public final static javax.xml.namespace.QName QName_0_3 = new javax.xml.namespace.QName( "", "game_2"); public final static javax.xml.namespace.QName QName_0_4 = new javax.xml.namespace.QName( "", "game_1"); public final static javax.xml.namespace.QName QName_0_5 = new javax.xml.namespace.QName( "", "is_tiebreak"); public final static javax.xml.namespace.QName QName_0_6 = new javax.xml.namespace.QName( "", "player1b"); public final static javax.xml.namespace.QName QName_0_7 = new javax.xml.namespace.QName( "", "player1a"); public final static javax.xml.namespace.QName QName_0_8 = new javax.xml.namespace.QName( "", "set_3_2"); public final static javax.xml.namespace.QName QName_0_9 = new javax.xml.namespace.QName( "", "set_3_1"); public final static javax.xml.namespace.QName QName_0_10 = new javax.xml.namespace.QName( "", "tiebreaker_5_2"); public final static javax.xml.namespace.QName QName_0_11 = new javax.xml.namespace.QName( "", "tiebreaker_5_1"); public final static javax.xml.namespace.QName QName_0_12 = new javax.xml.namespace.QName( "", "current_server"); public final static javax.xml.namespace.QName QName_0_13 = new javax.xml.namespace.QName( "", "set_2_2"); public final static javax.xml.namespace.QName QName_0_14 = new javax.xml.namespace.QName( "", "last_serv_speed"); public final static javax.xml.namespace.QName QName_0_15 = new javax.xml.namespace.QName( 140
  • Michael Wong 151220 "", "set_2_1"); public final static javax.xml.namespace.QName QName_0_16 = new javax.xml.namespace.QName( "", "tiebreaker_4_2"); public final static javax.xml.namespace.QName QName_0_17 = new javax.xml.namespace.QName( "", "tiebreaker_4_1"); public final static javax.xml.namespace.QName QName_0_18 = new javax.xml.namespace.QName( "", "player2a_atp"); public final static javax.xml.namespace.QName QName_0_19 = new javax.xml.namespace.QName( "", "set_1_2"); public final static javax.xml.namespace.QName QName_0_20 = new javax.xml.namespace.QName( "", "set_1_1"); public final static javax.xml.namespace.QName QName_0_21 = new javax.xml.namespace.QName( "", "tiebreaker_3_2"); public final static javax.xml.namespace.QName QName_0_22 = new javax.xml.namespace.QName( "", "tiebreaker_3_1"); public final static javax.xml.namespace.QName QName_1_40 = new javax.xml.namespace.QName( "http://www.w3.org/2001/XMLSchema", "string"); public final static javax.xml.namespace.QName QName_0_23 = new javax.xml.namespace.QName( "", "court_id"); public final static javax.xml.namespace.QName QName_0_24 = new javax.xml.namespace.QName( "", "event_id"); public final static javax.xml.namespace.QName QName_0_25 = new javax.xml.namespace.QName( "", "player1b_atp"); public final static javax.xml.namespace.QName QName_0_26 = new javax.xml.namespace.QName( "", "status"); public final static javax.xml.namespace.QName QName_0_27 = new javax.xml.namespace.QName( "", "tiebreaker_2_2"); public final static javax.xml.namespace.QName QName_0_28 = new javax.xml.namespace.QName( "", "tiebreaker_2_1"); public final static javax.xml.namespace.QName QName_1_41 = new javax.xml.namespace.QName( "http://www.w3.org/2001/XMLSchema", "int"); public final static javax.xml.namespace.QName QName_0_29 = new javax.xml.namespace.QName( "", "noNewNotifier"); public final static javax.xml.namespace.QName QName_0_30 = new javax.xml.namespace.QName( "", "tiebreaker_1_2"); public final static javax.xml.namespace.QName QName_0_31 = 141
  • Michael Wong 151220 new javax.xml.namespace.QName( "", "tiebreaker_1_1"); public final static javax.xml.namespace.QName QName_0_32 = new javax.xml.namespace.QName( "", "current_set"); public final static javax.xml.namespace.QName QName_0_33 = new javax.xml.namespace.QName( "", "player1a_atp"); public final static javax.xml.namespace.QName QName_0_34 = new javax.xml.namespace.QName( "", "round"); public final static javax.xml.namespace.QName QName_0_35 = new javax.xml.namespace.QName( "", "player2b"); public final static javax.xml.namespace.QName QName_0_36 = new javax.xml.namespace.QName( "", "player2a"); public final static javax.xml.namespace.QName QName_0_37 = new javax.xml.namespace.QName( "", "match_id"); public final static javax.xml.namespace.QName QName_0_38 = new javax.xml.namespace.QName( "", "set_5_2"); public final static javax.xml.namespace.QName QName_0_39 = new javax.xml.namespace.QName( "", "set_5_1"); } /** * ScoreUpdate_Helper.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.rrhighpayload.complexrpc.service; public class ScoreUpdate_Helper { // Type metadata private static org.apache.axis.description.TypeDesc typeDesc = new org.apache.axis.description.TypeDesc(ScoreUpdate.class); static { org.apache.axis.description.FieldDesc field = new org.apache.axis.description.ElementDesc(); field.setFieldName("player2B_Atp"); field.setXmlName(new javax.xml.namespace.QName("", "player2b_atp")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("set_4_2"); field.setXmlName(new javax.xml.namespace.QName("", "set_4_2")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("set_4_1"); field.setXmlName(new javax.xml.namespace.QName("", "set_4_1")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); 142
  • Michael Wong 151220 field.setFieldName("game_2"); field.setXmlName(new javax.xml.namespace.QName("", "game_2")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("game_1"); field.setXmlName(new javax.xml.namespace.QName("", "game_1")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("is_Tiebreak"); field.setXmlName(new javax.xml.namespace.QName("", "is_tiebreak")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("player1B"); field.setXmlName(new javax.xml.namespace.QName("", "player1b")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("player1A"); field.setXmlName(new javax.xml.namespace.QName("", "player1a")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("set_3_2"); field.setXmlName(new javax.xml.namespace.QName("", "set_3_2")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("set_3_1"); field.setXmlName(new javax.xml.namespace.QName("", "set_3_1")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("tiebreaker_5_2"); field.setXmlName(new javax.xml.namespace.QName("", "tiebreaker_5_2")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("tiebreaker_5_1"); field.setXmlName(new javax.xml.namespace.QName("", "tiebreaker_5_1")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("current_Server"); field.setXmlName(new javax.xml.namespace.QName("", "current_server")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("set_2_2"); field.setXmlName(new javax.xml.namespace.QName("", "set_2_2")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("last_Serv_Speed"); field.setXmlName(new javax.xml.namespace.QName("", "last_serv_speed")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); 143
  • Michael Wong 151220 field = new org.apache.axis.description.ElementDesc(); field.setFieldName("set_2_1"); field.setXmlName(new javax.xml.namespace.QName("", "set_2_1")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("tiebreaker_4_2"); field.setXmlName(new javax.xml.namespace.QName("", "tiebreaker_4_2")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("tiebreaker_4_1"); field.setXmlName(new javax.xml.namespace.QName("", "tiebreaker_4_1")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("player2A_Atp"); field.setXmlName(new javax.xml.namespace.QName("", "player2a_atp")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("set_1_2"); field.setXmlName(new javax.xml.namespace.QName("", "set_1_2")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("set_1_1"); field.setXmlName(new javax.xml.namespace.QName("", "set_1_1")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("tiebreaker_3_2"); field.setXmlName(new javax.xml.namespace.QName("", "tiebreaker_3_2")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("tiebreaker_3_1"); field.setXmlName(new javax.xml.namespace.QName("", "tiebreaker_3_1")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("court_Id"); field.setXmlName(new javax.xml.namespace.QName("", "court_id")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("event_Id"); field.setXmlName(new javax.xml.namespace.QName("", "event_id")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("player1B_Atp"); field.setXmlName(new javax.xml.namespace.QName("", "player1b_atp")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("status"); field.setXmlName(new javax.xml.namespace.QName("", "status")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); 144
  • Michael Wong 151220 typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("tiebreaker_2_2"); field.setXmlName(new javax.xml.namespace.QName("", "tiebreaker_2_2")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("tiebreaker_2_1"); field.setXmlName(new javax.xml.namespace.QName("", "tiebreaker_2_1")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("noNewNotifier"); field.setXmlName(new javax.xml.namespace.QName("", "noNewNotifier")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("tiebreaker_1_2"); field.setXmlName(new javax.xml.namespace.QName("", "tiebreaker_1_2")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("tiebreaker_1_1"); field.setXmlName(new javax.xml.namespace.QName("", "tiebreaker_1_1")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("current_Set"); field.setXmlName(new javax.xml.namespace.QName("", "current_set")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("player1A_Atp"); field.setXmlName(new javax.xml.namespace.QName("", "player1a_atp")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("round"); field.setXmlName(new javax.xml.namespace.QName("", "round")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("player2B"); field.setXmlName(new javax.xml.namespace.QName("", "player2b")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("player2A"); field.setXmlName(new javax.xml.namespace.QName("", "player2a")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("match_Id"); field.setXmlName(new javax.xml.namespace.QName("", "match_id")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("set_5_2"); field.setXmlName(new javax.xml.namespace.QName("", "set_5_2")); 145
  • Michael Wong 151220 field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); field = new org.apache.axis.description.ElementDesc(); field.setFieldName("set_5_1"); field.setXmlName(new javax.xml.namespace.QName("", "set_5_1")); field.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int")); typeDesc.addFieldDesc(field); }; /** * Return type metadata object */ public static org.apache.axis.description.TypeDesc getTypeDesc() { return typeDesc; } /** * Get Custom Serializer */ public static org.apache.axis.encoding.Serializer getSerializer( java.lang.String mechType, java.lang.Class javaType, javax.xml.namespace.QName xmlType) { return new ScoreUpdate_Ser( javaType, xmlType, typeDesc); }; /** * Get Custom Deserializer */ public static org.apache.axis.encoding.Deserializer getDeserializer( java.lang.String mechType, java.lang.Class javaType, javax.xml.namespace.QName xmlType) { return new ScoreUpdate_Deser( javaType, xmlType, typeDesc); }; } /** * ScoreUpdate_Deser.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.rrhighpayload.complexrpc.service; public class ScoreUpdate_Deser extends org.apache.axis.encoding.ser.BeanDeserializer { /** * Constructor */ public ScoreUpdate_Deser( java.lang.Class _javaType, javax.xml.namespace.QName _xmlType, org.apache.axis.description.TypeDesc _typeDesc) { super(_javaType, _xmlType, _typeDesc); } } /** * ScoreUpdate.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ 146
  • Michael Wong 151220 package lpc.rrhighpayload.complexrpc.service; public class ScoreUpdate implements java.io.Serializable { private java.lang.String player2B_Atp; private int set_4_2; private int set_4_1; private java.lang.String game_2; private java.lang.String game_1; private java.lang.String is_Tiebreak; private java.lang.String player1B; private java.lang.String player1A; private int set_3_2; private int set_3_1; private int tiebreaker_5_2; private int tiebreaker_5_1; private int current_Server; private int set_2_2; private int last_Serv_Speed; private int set_2_1; private int tiebreaker_4_2; private int tiebreaker_4_1; private java.lang.String player2A_Atp; private int set_1_2; private int set_1_1; private int tiebreaker_3_2; private int tiebreaker_3_1; private int court_Id; private java.lang.String event_Id; private java.lang.String player1B_Atp; private java.lang.String status; private int tiebreaker_2_2; private int tiebreaker_2_1; private java.lang.String noNewNotifier; private int tiebreaker_1_2; private int tiebreaker_1_1; private int current_Set; private java.lang.String player1A_Atp; private java.lang.String round; private java.lang.String player2B; private java.lang.String player2A; private int match_Id; private int set_5_2; private int set_5_1; public ScoreUpdate() { } public java.lang.String getPlayer2B_Atp() { return player2B_Atp; } public void setPlayer2B_Atp(java.lang.String player2B_Atp) { this.player2B_Atp = player2B_Atp; } public int getSet_4_2() { return set_4_2; } public void setSet_4_2(int set_4_2) { this.set_4_2 = set_4_2; } public int getSet_4_1() { return set_4_1; } public void setSet_4_1(int set_4_1) { this.set_4_1 = set_4_1; } 147
  • Michael Wong 151220 public java.lang.String getGame_2() { return game_2; } public void setGame_2(java.lang.String game_2) { this.game_2 = game_2; } public java.lang.String getGame_1() { return game_1; } public void setGame_1(java.lang.String game_1) { this.game_1 = game_1; } public java.lang.String getIs_Tiebreak() { return is_Tiebreak; } public void setIs_Tiebreak(java.lang.String is_Tiebreak) { this.is_Tiebreak = is_Tiebreak; } public java.lang.String getPlayer1B() { return player1B; } public void setPlayer1B(java.lang.String player1B) { this.player1B = player1B; } public java.lang.String getPlayer1A() { return player1A; } public void setPlayer1A(java.lang.String player1A) { this.player1A = player1A; } public int getSet_3_2() { return set_3_2; } public void setSet_3_2(int set_3_2) { this.set_3_2 = set_3_2; } public int getSet_3_1() { return set_3_1; } public void setSet_3_1(int set_3_1) { this.set_3_1 = set_3_1; } public int getTiebreaker_5_2() { return tiebreaker_5_2; } public void setTiebreaker_5_2(int tiebreaker_5_2) { this.tiebreaker_5_2 = tiebreaker_5_2; } public int getTiebreaker_5_1() { return tiebreaker_5_1; } public void setTiebreaker_5_1(int tiebreaker_5_1) { this.tiebreaker_5_1 = tiebreaker_5_1; 148
  • Michael Wong 151220 } public int getCurrent_Server() { return current_Server; } public void setCurrent_Server(int current_Server) { this.current_Server = current_Server; } public int getSet_2_2() { return set_2_2; } public void setSet_2_2(int set_2_2) { this.set_2_2 = set_2_2; } public int getLast_Serv_Speed() { return last_Serv_Speed; } public void setLast_Serv_Speed(int last_Serv_Speed) { this.last_Serv_Speed = last_Serv_Speed; } public int getSet_2_1() { return set_2_1; } public void setSet_2_1(int set_2_1) { this.set_2_1 = set_2_1; } public int getTiebreaker_4_2() { return tiebreaker_4_2; } public void setTiebreaker_4_2(int tiebreaker_4_2) { this.tiebreaker_4_2 = tiebreaker_4_2; } public int getTiebreaker_4_1() { return tiebreaker_4_1; } public void setTiebreaker_4_1(int tiebreaker_4_1) { this.tiebreaker_4_1 = tiebreaker_4_1; } public java.lang.String getPlayer2A_Atp() { return player2A_Atp; } public void setPlayer2A_Atp(java.lang.String player2A_Atp) { this.player2A_Atp = player2A_Atp; } public int getSet_1_2() { return set_1_2; } public void setSet_1_2(int set_1_2) { this.set_1_2 = set_1_2; } public int getSet_1_1() { return set_1_1; } public void setSet_1_1(int set_1_1) { 149
  • Michael Wong 151220 this.set_1_1 = set_1_1; } public int getTiebreaker_3_2() { return tiebreaker_3_2; } public void setTiebreaker_3_2(int tiebreaker_3_2) { this.tiebreaker_3_2 = tiebreaker_3_2; } public int getTiebreaker_3_1() { return tiebreaker_3_1; } public void setTiebreaker_3_1(int tiebreaker_3_1) { this.tiebreaker_3_1 = tiebreaker_3_1; } public int getCourt_Id() { return court_Id; } public void setCourt_Id(int court_Id) { this.court_Id = court_Id; } public java.lang.String getEvent_Id() { return event_Id; } public void setEvent_Id(java.lang.String event_Id) { this.event_Id = event_Id; } public java.lang.String getPlayer1B_Atp() { return player1B_Atp; } public void setPlayer1B_Atp(java.lang.String player1B_Atp) { this.player1B_Atp = player1B_Atp; } public java.lang.String getStatus() { return status; } public void setStatus(java.lang.String status) { this.status = status; } public int getTiebreaker_2_2() { return tiebreaker_2_2; } public void setTiebreaker_2_2(int tiebreaker_2_2) { this.tiebreaker_2_2 = tiebreaker_2_2; } public int getTiebreaker_2_1() { return tiebreaker_2_1; } public void setTiebreaker_2_1(int tiebreaker_2_1) { this.tiebreaker_2_1 = tiebreaker_2_1; } public java.lang.String getNoNewNotifier() { return noNewNotifier; } 150
  • Michael Wong 151220 public void setNoNewNotifier(java.lang.String noNewNotifier) { this.noNewNotifier = noNewNotifier; } public int getTiebreaker_1_2() { return tiebreaker_1_2; } public void setTiebreaker_1_2(int tiebreaker_1_2) { this.tiebreaker_1_2 = tiebreaker_1_2; } public int getTiebreaker_1_1() { return tiebreaker_1_1; } public void setTiebreaker_1_1(int tiebreaker_1_1) { this.tiebreaker_1_1 = tiebreaker_1_1; } public int getCurrent_Set() { return current_Set; } public void setCurrent_Set(int current_Set) { this.current_Set = current_Set; } public java.lang.String getPlayer1A_Atp() { return player1A_Atp; } public void setPlayer1A_Atp(java.lang.String player1A_Atp) { this.player1A_Atp = player1A_Atp; } public java.lang.String getRound() { return round; } public void setRound(java.lang.String round) { this.round = round; } public java.lang.String getPlayer2B() { return player2B; } public void setPlayer2B(java.lang.String player2B) { this.player2B = player2B; } public java.lang.String getPlayer2A() { return player2A; } public void setPlayer2A(java.lang.String player2A) { this.player2A = player2A; } public int getMatch_Id() { return match_Id; } public void setMatch_Id(int match_Id) { this.match_Id = match_Id; } public int getSet_5_2() { return set_5_2; } 151
  • Michael Wong 151220 public void setSet_5_2(int set_5_2) { this.set_5_2 = set_5_2; } public int getSet_5_1() { return set_5_1; } public void setSet_5_1(int set_5_1) { this.set_5_1 = set_5_1; } private java.lang.Object __equalsCalc = null; public synchronized boolean equals(java.lang.Object obj) { if (!(obj instanceof ScoreUpdate)) return false; ScoreUpdate other = (ScoreUpdate) obj; if (obj == null) return false; if (this == obj) return true; if (__equalsCalc != null) { return (__equalsCalc == obj); } __equalsCalc = obj; boolean _equals; _equals = true && ((player2B_Atp==null && other.getPlayer2B_Atp()==null) || (player2B_Atp!=null && player2B_Atp.equals(other.getPlayer2B_Atp()))) && set_4_2 == other.getSet_4_2() && set_4_1 == other.getSet_4_1() && ((game_2==null && other.getGame_2()==null) || (game_2!=null && game_2.equals(other.getGame_2()))) && ((game_1==null && other.getGame_1()==null) || (game_1!=null && game_1.equals(other.getGame_1()))) && ((is_Tiebreak==null && other.getIs_Tiebreak()==null) || (is_Tiebreak!=null && is_Tiebreak.equals(other.getIs_Tiebreak()))) && ((player1B==null && other.getPlayer1B()==null) || (player1B!=null && player1B.equals(other.getPlayer1B()))) && ((player1A==null && other.getPlayer1A()==null) || (player1A!=null && player1A.equals(other.getPlayer1A()))) && set_3_2 == other.getSet_3_2() && set_3_1 == other.getSet_3_1() && tiebreaker_5_2 == other.getTiebreaker_5_2() && tiebreaker_5_1 == other.getTiebreaker_5_1() && current_Server == other.getCurrent_Server() && set_2_2 == other.getSet_2_2() && last_Serv_Speed == other.getLast_Serv_Speed() && set_2_1 == other.getSet_2_1() && tiebreaker_4_2 == other.getTiebreaker_4_2() && tiebreaker_4_1 == other.getTiebreaker_4_1() && ((player2A_Atp==null && other.getPlayer2A_Atp()==null) || (player2A_Atp!=null && player2A_Atp.equals(other.getPlayer2A_Atp()))) && set_1_2 == other.getSet_1_2() && set_1_1 == other.getSet_1_1() && tiebreaker_3_2 == other.getTiebreaker_3_2() && tiebreaker_3_1 == other.getTiebreaker_3_1() && court_Id == other.getCourt_Id() && ((event_Id==null && other.getEvent_Id()==null) || (event_Id!=null && event_Id.equals(other.getEvent_Id()))) && ((player1B_Atp==null && other.getPlayer1B_Atp()==null) || (player1B_Atp!=null && player1B_Atp.equals(other.getPlayer1B_Atp()))) && ((status==null && other.getStatus()==null) || (status!=null && 152
  • Michael Wong 151220 status.equals(other.getStatus()))) && tiebreaker_2_2 == other.getTiebreaker_2_2() && tiebreaker_2_1 == other.getTiebreaker_2_1() && ((noNewNotifier==null && other.getNoNewNotifier()==null) || (noNewNotifier!=null && noNewNotifier.equals(other.getNoNewNotifier()))) && tiebreaker_1_2 == other.getTiebreaker_1_2() && tiebreaker_1_1 == other.getTiebreaker_1_1() && current_Set == other.getCurrent_Set() && ((player1A_Atp==null && other.getPlayer1A_Atp()==null) || (player1A_Atp!=null && player1A_Atp.equals(other.getPlayer1A_Atp()))) && ((round==null && other.getRound()==null) || (round!=null && round.equals(other.getRound()))) && ((player2B==null && other.getPlayer2B()==null) || (player2B!=null && player2B.equals(other.getPlayer2B()))) && ((player2A==null && other.getPlayer2A()==null) || (player2A!=null && player2A.equals(other.getPlayer2A()))) && match_Id == other.getMatch_Id() && set_5_2 == other.getSet_5_2() && set_5_1 == other.getSet_5_1(); __equalsCalc = null; return _equals; } private boolean __hashCodeCalc = false; public synchronized int hashCode() { if (__hashCodeCalc) { return 0; } __hashCodeCalc = true; int _hashCode = 1; if (getPlayer2B_Atp() != null) { _hashCode += getPlayer2B_Atp().hashCode(); } _hashCode += getSet_4_2(); _hashCode += getSet_4_1(); if (getGame_2() != null) { _hashCode += getGame_2().hashCode(); } if (getGame_1() != null) { _hashCode += getGame_1().hashCode(); } if (getIs_Tiebreak() != null) { _hashCode += getIs_Tiebreak().hashCode(); } if (getPlayer1B() != null) { _hashCode += getPlayer1B().hashCode(); } if (getPlayer1A() != null) { _hashCode += getPlayer1A().hashCode(); } _hashCode += getSet_3_2(); _hashCode += getSet_3_1(); _hashCode += getTiebreaker_5_2(); _hashCode += getTiebreaker_5_1(); _hashCode += getCurrent_Server(); _hashCode += getSet_2_2(); _hashCode += getLast_Serv_Speed(); _hashCode += getSet_2_1(); _hashCode += getTiebreaker_4_2(); _hashCode += getTiebreaker_4_1(); if (getPlayer2A_Atp() != null) { _hashCode += getPlayer2A_Atp().hashCode(); } _hashCode += getSet_1_2(); _hashCode += getSet_1_1(); _hashCode += getTiebreaker_3_2(); 153
  • Michael Wong 151220 _hashCode += getTiebreaker_3_1(); _hashCode += getCourt_Id(); if (getEvent_Id() != null) { _hashCode += getEvent_Id().hashCode(); } if (getPlayer1B_Atp() != null) { _hashCode += getPlayer1B_Atp().hashCode(); } if (getStatus() != null) { _hashCode += getStatus().hashCode(); } _hashCode += getTiebreaker_2_2(); _hashCode += getTiebreaker_2_1(); if (getNoNewNotifier() != null) { _hashCode += getNoNewNotifier().hashCode(); } _hashCode += getTiebreaker_1_2(); _hashCode += getTiebreaker_1_1(); _hashCode += getCurrent_Set(); if (getPlayer1A_Atp() != null) { _hashCode += getPlayer1A_Atp().hashCode(); } if (getRound() != null) { _hashCode += getRound().hashCode(); } if (getPlayer2B() != null) { _hashCode += getPlayer2B().hashCode(); } if (getPlayer2A() != null) { _hashCode += getPlayer2A().hashCode(); } _hashCode += getMatch_Id(); _hashCode += getSet_5_2(); _hashCode += getSet_5_1(); __hashCodeCalc = false; return _hashCode; } } RRHighPayload_SEI_mapping <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE java-wsdl-mapping PUBLIC "-//IBM Corporation, Inc.//DTD J2EE JAX-RPC mapping 1.0//EN" "http://www.ibm.com/webservices/dtd/j2ee_jaxrpc_mapping_1_0.dtd"> <java-wsdl-mapping> <package-mapping> <package-type>lpc.rrhighpayload.complexrpc.server</package-type> <namespaceURI>http://server.complexrpc.rrhighpayload.lpc</namespaceURI> </package-mapping> <package-mapping> <package-type>lpc.rrhighpayload.complexrpc.service</package-type> <namespaceURI>http://service.complexrpc.rrhighpayload.lpc</namespaceURI> </package-mapping> </java-wsdl-mapping> /* * Created on 16-Aug-2003 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ package lpc.rrhighpayload.complexrpc.server; import lpc.rrhighpayload.complexrpc.service.ScoreUpdate; public class RRHighPayload extends Thread{ public ScoreUpdate makeRequest(int i) throws java.rmi.RemoteException{ //if an even number return ladies doubles match if ((i % 2) == 0){ 154
  • Michael Wong 151220 return new ScoreUpdate("LD", "1", 18, 9999, 11, "[qwertyuiopasdfghjklzxcvbnm0987654321qwertyuiopasdfghjklzxc vbnm]", "player_ATP1a", "- qwertyuiopasdfghjklzxcvbnm0987654321qwertyuiopasdfghjklzxcvbnm-", "player_ATP1b", "*qwertyuiopasdfghjklzxcvbnm0987654321qwertyuiopasdfghjklzxc vbnm*", "player_ATP2a", "@qwertyuiopasdfghjklzxcvbnm0987654321qwertyuiopasdfghjklzx cvbnm@", "player_ATP2b", 6, 7, 6, 5, 6, 7, 6, 5, 6, 6, 6, 5, 6, 7, 6, 5, 6, 7, 6, 5, "a", "b", "A", 5, "y", 147); } else { //otherwise return a mixed doubles match return new ScoreUpdate("MX", "1", 18, 9999, 11, "[qwertyuiopasdfghjklzxcvbnm0987654321qwertyuiopasd fghjklzxcvbnm]", "player_ATP1a", "- qwertyuiopasdfghjklzxcvbnm0987654321qwertyuiopasdfghjklzxcvbnm-", "player_ATP1b", "*qwertyuiopasdfghjklzxcvbnm0987654321qwertyuiopasd fghjklzxcvbnm*", "player_ATP2a", "@qwertyuiopasdfghjklzxcvbnm0987654321qwertyuiopas dfghjklzxcvbnm@", "player_ATP2b", 6, 7, 6, 5, 6, 7, 6, 5, 6, 6, 6, 5, 6, 7, 6, 5, 6, 7, 6, 5, "a", "b", "A", 5, "y", 147); }//end if else block; }//end makeRequest(int loopNum); public void run(){ this.setDaemon(true); } } /* * Created on 16-Aug-2003 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ package lpc.rrhighpayload.complexrpc.client; import lpc.rrhighpayload.complexrpc.server.*; import lpc.rrhighpayload.complexrpc.service.*; import java.util.*; import java.io.*; public class RRHighPayloadClient extends Thread { long timeStamp; String logEntry; Vector startPointTimestamps = new Vector(); Vector endPointTimestamps = new Vector(); int numOfRepetitions; //ScoreUpdate aScoreUpdate; public RRHighPayloadClient(String args){ super(); numOfRepetitions = Integer.parseInt(args); this.start(); 155
  • Michael Wong 151220 } public void run(){ //System.out.println("started thread"); //disable any security settings that may be in place System.setSecurityManager(null); try { RRHighPayload_SEIService loc = new RRHighPayload_SEIServiceLocator(); RRHighPayload_SEI port = (RRHighPayload_SEI)loc.getRRHighPayload(); for(int i=0; i <= numOfRepetitions; i++ ) { // timestamping START TIME makeLogEntry(startPointTimestamps); outputResults(port.makeRequest(i)); //System.out.println(i + " number of calls to web service"); //log end point after each 'poll' makeLogEntry(endPointTimestamps); //sleep for 50ms before polling again - simulate JSB Thread.sleep(50); } }catch(Exception e){ System.out.println("RRHighPayloadClient exception" + e); } //end the testcase - write START TIMEs and END TIMEs to file endTestCase(); } public static void main(String[] args){ RRHighPayloadClient aRRMultiplePayloadClient = new RRHighPayloadClient(args[0]); } public void makeLogEntry(Vector timestampLogs){ timeStamp = System.currentTimeMillis(); if(timestampLogs.equals(startPointTimestamps)) logEntry = timeStamp + " " + " STARTPOINT"; else{ //want to "pair" log entries - only increment counter if ENDPOINT logEntry = timeStamp + " " + " ENDPOINT"; } timestampLogs.add(logEntry); }//end makeLogEntry() private void writeResultsToFile(Vector timestampLogs, String filename){ //FileOutputStream fout; RandomAccessFile raf; System.setSecurityManager(null); String logEntry = ""; 156
  • Michael Wong 151220 long filelength; String ENDL = System.getProperty("line.separator"); try{ //open a new output stream //fout = new FileOutputStream(filename); File f = new File(filename); //new RandomAccessFile raf = new RandomAccessFile(filename, "rw"); //set up a loop to iterate through counter length //write each entry to file //ListIterator iter = timestampLogs.listIterator(); for(int i=0; i < timestampLogs.size(); i++){ logEntry = logEntry + " " + (String)timestampLogs.get(i) + ENDL; } //fout.close(); filelength = f.length(); raf.seek(filelength); raf.writeBytes(logEntry); raf.close(); }catch(IOException e){ System.err.println("Unable to print to file"); System.exit(-1); }//end try catch block }//end writeResultsToFile private void outputResults(ScoreUpdate aScoreUpdate){ //FileOutputStream fout; //PrintStream ps; RandomAccessFile raf; long filelength; String ENDL = System.getProperty("line.separator"); System.setSecurityManager(null); try{ //open a new output stream //new RandomAccessFile File f = new File("DBscoreupdates.txt"); raf = new RandomAccessFile(f, "rw"); if(aScoreUpdate.getNoNewNotifier() == "NoNewData"){ filelength = f.length(); raf.seek(filelength); raf.writeBytes(aScoreUpdate.getNoNewNotifier()); }else{ filelength = f.length(); raf.seek(filelength); raf.writeBytes(aScoreUpdate.getEvent_id()+ " " + aScoreUpdate.getRound()+ " " + aScoreUpdate.getCourt_id()+ " " + aScoreUpdate.getMatch_id()+ " " +aScoreUpdate.getCurrent_server()+ " " + aScoreUpdate.getPlayer1a()+ " " + aScoreUpdate.getPlayer1a_atp()+ " " + aScoreUpdate.getPlayer1b()+ " " + aScoreUpdate.getPlayer1b_atp()+ " " + aScoreUpdate.getPlayer2a()+ " " + aScoreUpdate.getPlayer2a_atp()+ " " + aScoreUpdate.getPlayer2b()+ " " + aScoreUpdate.getPlayer2b_atp()+ " " + aScoreUpdate.getSet_1_1()+ " " + aScoreUpdate.getTiebreaker_1_1()+ " " + aScoreUpdate.getSet_2_1()+ " " + aScoreUpdate.getTiebreaker_2_1()+ " " + aScoreUpdate.getSet_3_1()+ " " + aScoreUpdate.getTiebreaker_3_1()+ " " + aScoreUpdate.getSet_4_1()+ " " + aScoreUpdate.getTiebreaker_4_1()+ " " + 157
  • Michael Wong 151220 aScoreUpdate.getSet_5_1()+ " " + aScoreUpdate.getTiebreaker_5_1()+ " " + aScoreUpdate.getSet_1_2()+ " " + aScoreUpdate.getTiebreaker_1_2()+ " " + aScoreUpdate.getSet_2_2()+ " " + aScoreUpdate.getTiebreaker_2_2()+ " " + aScoreUpdate.getSet_3_2()+ " " + aScoreUpdate.getTiebreaker_3_2()+ " " + aScoreUpdate.getSet_4_2()+ " " + aScoreUpdate.getTiebreaker_4_2()+ " " + aScoreUpdate.getSet_5_2()+ " " + aScoreUpdate.getTiebreaker_5_2()+ " " + aScoreUpdate.getGame_1()+ " " + aScoreUpdate.getGame_2()+ " " + aScoreUpdate.getStatus()+ " " + aScoreUpdate.getCurrent_set()+ " " + aScoreUpdate.getIs_tiebreak()+ " " + aScoreUpdate.getLast_serv_speed() + ENDL + ENDL); } raf.close(); //fout.close(); //ps.close(); }catch(IOException e){ System.err.println("Unable to print to file"); System.exit(-1); }//end try catch block }//end outputResults() public void endTestCase(){ writeResultsToFile(startPointTimestamps, "RRHighPayloadStartPoint.txt"); writeResultsToFile(endPointTimestamps, "RRHighPayloadEndPoint.txt"); } } /** * RRHighPayload_SEI.java * * This file was auto-generated from WSDL * by the Apache Axis WSDL2Java emitter. */ package lpc.rrhighpayload.complexrpc.server; public interface RRHighPayload_SEI extends java.rmi.Remote { public void run() throws java.rmi.RemoteException; public lpc.rrhighpayload.complexrpc.service.ScoreUpdate makeRequest(int i) throws java.rmi.RemoteException; } 158
  • Michael Wong 151220 Appendix I: Complex RPC Results 2 Bytes Test Run 1 1 2 3 4 5 6 7 8 9 10 Start Point (ms) 1061660942304 1061660954081 1061660958076 1061660961651 1061660965357 1061660968812 1061660972347 1061660975832 1061660979307 1061660983293 End Point (ms) 1061660944647 1061660954782 1061660958687 1061660962423 1061660965908 1061660969363 1061660972898 1061660976443 1061660979958 1061660983853 2.343 0.701 0.611 0.772 0.551 0.551 0.551 0.611 0.651 0.560 Test Run 2 Start Point (ms) 1061661173874 1061661179472 1061661183247 1061661187003 1061661190838 1061661194403 1061661198119 1061661201874 1061661205389 1061661210206 End Point (ms) 1061661176347 1061661180123 1061661183818 1061661187784 1061661191399 1061661195024 1061661198780 1061661202445 1061661205970 1061661210807 2.473 0.651 0.571 0.781 0.561 0.621 0.661 0.571 0.581 0.601 Test Run 3 Start Point (ms) 1061661347681 1061661353279 1061661357135 1061661360620 1061661364395 1061661367951 1061661371756 1061661375211 1061661378826 1061661382552 End Point (ms) 1061661350185 1061661353920 1061661357706 1061661361451 1061661365026 1061661368521 1061661372317 1061661375782 1061661379467 1061661383202 2.504 0.641 0.571 0.831 0.631 0.570 0.561 0.571 0.641 0.650 5 Bytes Test Run 1 Start Point (ms) 1061661696733 1061661700749 1061661704795 1061661708881 1061661715130 1061661720568 1061661725925 1061661729911 1061661734978 1061661738754 End Point (ms) 1061661699010 1061661701300 1061661705346 1061661709502 1061661715731 1061661721559 1061661726486 1061661730532 1061661735579 1061661739315 2.277 0.551 0.551 0.621 0.601 0.991 0.561 0.621 0.601 0.561 Test Run 2 Start Point (ms) 1061661800432 1061661806952 1061661811669 1061661815284 1061661818849 1061661822474 1061661826019 1061661829534 1061661833079 1061661836655 End Point (ms) 1061661802803 1061661808103 1061661812219 1061661815915 1061661819430 1061661823055 1061661826590 1061661830165 1061661833700 1061661837225 2.371 1.151 0.550 0.631 0.581 0.581 0.571 0.631 0.621 0.570 Test Run 3 Start Point (ms) 1061661957979 1061661968965 1061661972740 1061661976335 1061661980051 1061661983526 1061661987041 1061661990205 1061661994461 1061661998257 End Point (ms) 1061661960422 1061661969596 1061661973311 1061661977127 1061661980612 1061661984137 1061661987612 1061661990756 1061661995112 1061661998848 2.443 0.631 0.571 0.792 0.561 0.611 0.571 0.551 0.651 0.591 10 Bytes Test Run 1 Start Point (ms) 1061662293448 1061662299277 1061662303332 1061662307408 1061662311324 1061662314839 1061662318624 1061662322240 1061662325915 1061662329881 End Point (ms) 1061662295822 1061662299907 1061662303893 1061662308229 1061662311875 1061662315390 1061662319175 1061662322800 1061662326626 1061662330491 2.374 0.630 0.561 0.821 0.551 0.551 0.551 0.560 0.711 0.610 Test Run 2 Start Point (ms) 1061662453038 1061662460318 1061662464805 1061662468700 1061662473157 1061662477172 1061662480737 1061662484373 1061662488178 1061662491753 End Point (ms) 1061662455351 1061662460999 1061662465355 1061662469471 1061662473717 1061662477733 1061662481298 1061662485134 1061662488809 1061662492304 2.313 0.681 0.550 0.771 0.560 0.561 0.561 0.761 0.631 0.551 Test Run 3 Start Point (ms) 1061662583595 1061662589554 1061662593169 1061662596834 1061662600550 1061662603995 1061662607530 1061662610915 1061662614280 1061662617744 End Point (ms) 1061662585879 1061662590175 1061662593730 1061662597606 1061662601161 1061662604556 1061662608091 1061662611465 1061662614910 1061662618385 2.284 0.621 0.561 0.772 0.611 0.561 0.561 0.550 0.630 0.641 2 Longs 1 2 3 4 5 6 7 8 9 10 Test Run 1 159
  • Michael Wong 151220 Start Point (ms) 1061674810288 1061674816390 1061674820236 1061674825333 1061674829189 1061674833084 1061674836679 1061674850870 1061674855086 1061674858671 End Point (ms) 1061674812682 1061674817021 1061674820787 1061674826104 1061674829749 1061674833645 1061674837230 1061674851861 1061674855657 1061674859222 2.394 0.631 0.551 0.771 0.560 0.561 0.551 0.991 0.571 0.551 Test Run 2 Start Point (ms) 1061675049225 1061675054533 1061675058719 1061675062404 1061675066420 1061675070025 1061675073610 1061675077406 1061675081151 1061675084976 End Point (ms) 1061675051508 1061675055494 1061675059280 1061675063175 1061675066981 1061675070636 1061675074311 1061675077956 1061675081722 1061675085527 2.283 0.961 0.561 0.771 0.561 0.611 0.701 0.550 0.571 0.551 Test Run 3 Start Point (ms) 1061675185791 1061675191430 1061675195485 1061675199201 1061675202996 1061675206591 1061675210197 1061675213762 1061675217467 1061675221042 End Point (ms) 1061675188245 1061675192060 1061675196036 1061675199962 1061675203557 1061675207142 1061675210807 1061675214312 1061675218028 1061675221603 2.454 0.630 0.551 0.761 0.561 0.551 0.610 0.550 0.561 0.561 5 Longs Test Run 1 Start Point (ms) 1061675811320 1061675827894 1061675831719 1061675835635 1061675839570 1061675843306 1061675847111 1061675850757 1061675854552 1061675858277 End Point (ms) 1061675813833 1061675828515 1061675832290 1061675836416 1061675840191 1061675843927 1061675847732 1061675851488 1061675855133 1061675858888 2.513 0.621 0.571 0.781 0.621 0.621 0.621 0.731 0.581 0.611 Test Run 2 Start Point (ms) 1061676103700 1061676345899 1061676349914 1061676353900 1061676357906 1061676362442 1061676367940 1061676373468 1061676378566 1061676382832 End Point (ms) 1061676106204 1061676346590 1061676350535 1061676354731 1061676358517 1061676362993 1061676368811 1061676374339 1061676379126 1061676383382 2.504 0.691 0.621 0.831 0.611 0.551 0.871 0.871 0.560 0.550 Test Run 3 Start Point (ms) 1061676652931 1061676659400 1061676663206 1061676666911 1061676670716 1061676674402 1061676678217 1061676681852 1061676685538 1061676691496 End Point (ms) 1061676655384 1061676660021 1061676663827 1061676667692 1061676671337 1061676675103 1061676678788 1061676682413 1061676686119 1061676692067 2.453 0.621 0.621 0.781 0.621 0.701 0.571 0.561 0.581 0.571 10 Longs Test Run 1 Start Point (ms) 1061677030374 1061677050152 1061677058444 1061677062139 1061677065905 1061677069590 1061677073165 1061677077101 1061677080896 1061677084541 End Point (ms) 1061677032687 1061677050783 1061677059035 1061677062920 1061677066476 1061677070141 1061677073946 1061677077722 1061677081537 1061677085132 2.313 0.631 0.591 0.781 0.571 0.551 0.781 0.621 0.641 0.591 Test Run 2 Start Point (ms) 1061677185887 1061677191535 1061677195291 1061677198866 1061677203142 1061677206757 1061677210232 1061677213928 1061677217583 1061677221188 End Point (ms) 1061677188351 1061677192206 1061677195902 1061677199687 1061677203753 1061677207308 1061677210783 1061677214518 1061677218214 1061677221819 2.464 0.671 0.611 0.821 0.611 0.551 0.551 0.590 0.631 0.631 Test Run 3 Start Point (ms) 1061677310577 1061677316936 1061677320741 1061677324366 1061677328182 1061677332117 1061677335673 1061677339358 1061677343093 1061677346809 End Point (ms) 1061677313030 1061677317557 1061677321292 1061677325137 1061677328743 1061677332668 1061677336283 1061677339969 1061677343734 1061677347369 2.453 0.621 0.551 0.771 0.561 0.551 0.610 0.611 0.641 0.560 160
  • Michael Wong 151220 2 Strings 1 2 3 4 5 6 7 8 9 10 Test Run1 Start Point (ms) 1061714868855 1061714875514 1061714897997 1061714901822 1061714905808 1061714910545 1061714914100 1061714917675 1061714921160 1061714924755 End Point (ms) 1061714871278 1061714876115 1061714898708 1061714902613 1061714906559 1061714911115 1061714914741 1061714918266 1061714921761 1061714925336 2.423 0.601 0.711 0.791 0.751 0.570 0.641 0.591 0.601 0.581 Test Run2 Start Point (ms) 1061715056525 1061715062283 1061715066369 1061715071516 1061715075802 1061715080008 1061715083904 1061715088290 1061715092186 1061715096001 End Point (ms) 1061715058918 1061715062954 1061715067080 1061715072307 1061715076373 1061715080579 1061715084705 1061715088921 1061715092827 1061715096592 2.393 0.671 0.711 0.791 0.571 0.571 0.801 0.631 0.641 0.591 Test Run3 Start Point (ms) 1061715204197 1061715209675 1061715213290 1061715217025 1061715220961 1061715224606 1061715228392 1061715232047 1061715235592 1061715239337 End Point (ms) 1061715206530 1061715210326 1061715213961 1061715217826 1061715221542 1061715225397 1061715229023 1061715232628 1061715236243 1061715239938 2.333 0.651 0.671 0.801 0.581 0.791 0.631 0.581 0.651 0.601 5 Strings Test Run1 Start Point (ms) 1061715614697 1061715622178 1061715630430 1061715636028 1061715640785 1061715645041 1061715649527 1061715653753 1061715658300 1061715662266 End Point (ms) 1061715617171 1061715622809 1061715631261 1061715636819 1061715641366 1061715645672 1061715650108 1061715654324 1061715658891 1061715662836 2.474 0.631 0.831 0.791 0.581 0.631 0.581 0.571 0.591 0.570 Test Run2 Start Point (ms) 1061715830497 1061715837918 1061715843476 1061715848694 1061715853270 1061715858317 1061715862043 1061715866840 1061715871066 1061715874891 End Point (ms) 1061715832851 1061715838569 1061715844197 1061715849485 1061715854011 1061715858898 1061715862634 1061715867411 1061715871657 1061715875482 2.354 0.651 0.721 0.791 0.741 0.581 0.591 0.571 0.591 0.591 Test Run 3 Start Point (ms) 1061715955637 1061715962407 1061715970118 1061715976447 1061715980453 1061715984319 1061715988645 1061715992430 1061715996266 1061716000993 End Point (ms) 1061715958071 1061715963018 1061715970789 1061715977238 1061715981034 1061715985060 1061715989226 1061715993011 1061715996847 1061716001573 2.434 0.611 0.671 0.791 0.581 0.741 0.581 0.581 0.581 0.580 10 Strings Test Run1 Start Point (ms) 1061716378215 1061716385836 1061716390943 1061716395330 1061716399436 1061716403992 1061716407778 1061716411343 1061716415058 1061716418894 End Point (ms) 1061716380679 1061716386447 1061716391614 1061716396281 1061716400016 1061716404623 1061716408358 1061716411924 1061716415649 1061716419494 2.464 0.611 0.671 0.951 0.580 0.631 0.580 0.581 0.591 0.600 Test Run 2 Start Point (ms) 1061716496796 1061716502924 1061716506860 1061716510666 1061716514501 1061716518186 1061716521952 1061716531045 1061716545285 1061716549001 End Point (ms) 1061716499149 1061716503535 1061716507531 1061716511517 1061716515132 1061716518917 1061716522553 1061716531636 1061716545876 1061716549591 2.353 0.611 0.671 0.851 0.631 0.731 0.601 0.591 0.591 0.590 Test Run 3 Start Point (ms) 1061716636176 1061716642535 1061716646431 1061716650226 1061716654112 1061716657757 1061716661302 1061716664977 1061716668603 1061716672338 End Point (ms) 1061716638539 1061716643206 1061716647102 1061716651067 1061716654683 1061716658338 1061716661963 1061716665548 1061716669254 1061716672979 2.363 0.671 0.671 0.841 0.571 0.581 0.661 0.571 0.651 0.641 161
  • Michael Wong 151220 Appendix J: Simple RPC Results Return String 1 2 3 4 5 6 7 8 9 10 TEST RUN1 START POINT 1061643393782 1061643411026 1061643414752 1061643418267 1061643421572 1061643424886 1061643429813 1061643433489 1061643436944 1061643440339 END POINT 1061643395614 1061643411587 1061643415222 1061643418737 1061643422032 1061643425397 1061643430284 1061643433949 1061643437464 1061643440819 1.832 0.561 0.470 0.470 0.460 0.511 0.471 0.460 0.520 0.480 TEST RUN2 START POINT 1061643532701 1061643546952 1061643550867 1061643554533 1061643557837 1061643579268 1061643583384 1061643587170 1061643591736 1061643595171 END POINT 1061643534904 1061643547513 1061643551368 1061643555003 1061643558518 1061643579829 1061643583905 1061643587690 1061643592207 1061643595702 2.203 0.561 0.501 0.470 0.681 0.561 0.521 0.520 0.471 0.531 TEST RUN3 START POINT 1061643741021 1061643747851 1061643751656 1061643755592 1061643759317 1061643769231 1061643773718 1061643777253 1061643780558 1061643783893 END POINT 1061643743224 1061643748351 1061643752217 1061643756113 1061643760008 1061643769832 1061643774239 1061643777714 1061643781028 1061643784363 2.203 0.500 0.561 0.521 0.691 0.601 0.521 0.461 0.470 0.470 Return Short TEST RUN1 START POINT 1061641451645 1061641474799 1061641479075 1061641483952 1061641487647 1061641499504 1061641503680 1061641507255 1061641511041 1061641514609 END POINT 1061641453959 1061641475309 1061641479586 1061641484432 1061641488338 1061641500035 1061641504161 1061641507726 1061641511511 1061641515129 2.314 0.510 0.511 0.480 0.691 0.531 0.481 0.471 0.470 0.520 TEST RUN2 START POINT 1061641701287 1061641706525 1061641720275 1061641724290 1061641728076 1061641743037 1061641748355 1061641752671 1061641756196 1061641759651 END POINT 1061641703501 1061641707316 1061641721106 1061641724771 1061641728757 1061641743558 1061641749006 1061641753192 1061641756667 1061641760132 2.214 0.791 0.831 0.481 0.681 0.521 0.651 0.521 0.471 0.481 TEST RUN3 START POINT 1061641947331 1061641959639 1061641963394 1061641967220 1061641974490 1061641990233 1061641995300 1061641999286 1061642002801 1061642006276 END POINT 1061641949534 1061641960150 1061641963915 1061641967690 1061641975231 1061641990754 1061641995771 1061641999767 1061642003332 1061642006757 2.203 0.511 0.521 0.470 0.741 0.521 0.471 0.481 0.531 0.481 162
  • Michael Wong 151220 Return Long TEST RUN1 START POINT 1061639710911 1061639732113 1061639739143 1061639742798 1061639747765 1061639752032 1061639756428 1061639762587 1061639767183 1061639772401 END POINT 1061639712825 1061639732624 1061639739614 1061639743269 1061639748306 1061639752502 1061639756909 1061639763057 1061639767644 1061639773102 1.914 0.511 0.471 0.471 0.541 0.470 0.481 0.470 0.461 0.701 TEST RUN2 START POINT 1061640000479 1061640019997 1061640025224 1061640029511 1061640033206 1061640057140 1061640061026 1061640064821 1061640068537 1061640072082 END POINT 1061640002702 1061640020598 1061640026076 1061640029991 1061640033887 1061640057661 1061640061507 1061640065292 1061640069017 1061640072633 2.223 0.601 0.852 0.480 0.681 0.521 0.481 0.471 0.480 0.551 TEST RUN3 START POINT 1061640218112 1061640232823 1061640237450 1061640242917 1061640246963 1061640267923 1061640272600 1061640276375 1061640279951 1061640284037 END POINT 1061640220315 1061640233364 1061640237920 1061640243618 1061640247644 1061640268454 1061640273121 1061640276906 1061640280431 1061640284517 2.203 0.541 0.470 0.701 0.681 0.531 0.521 0.531 0.480 0.480 Return Int TEST RUN1 START POINT 1061637887401 1061637897475 1061637918144 1061637922660 1061637926316 1061637949729 1061637953715 1061637957410 1061637961106 1061637964941 END POINT 1061637889804 1061637897986 1061637918654 1061637923141 1061637926996 1061637950200 1061637954186 1061637957891 1061637961676 1061637965482 2.403 0.511 0.510 0.481 0.680 0.471 0.471 0.481 0.570 0.541 TEST RUN2 START POINT 1061638136147 1061638151479 1061638155725 1061638159381 1061638162355 1061638172950 1061638176465 1061638182324 1061638185999 1061638190836 END POINT 1061638138360 1061638152050 1061638156236 1061638159911 1061638163036 1061638173431 1061638176936 1061638182794 1061638186520 1061638191317 2.213 0.571 0.511 0.530 0.681 0.481 0.471 0.470 0.521 0.481 TEST RUN3 START POINT 1061638367366 1061638385462 1061638388937 1061638392833 1061638397019 1061638411450 1061638415565 1061638419161 1061638422676 1061638426461 END POINT 1061638369589 1061638385973 1061638389448 1061638393313 1061638397700 1061638412281 1061638416036 1061638419631 1061638423196 1061638426942 2.223 0.511 0.511 0.480 0.681 0.831 0.471 0.470 0.520 0.481 163
  • Michael Wong 151220 Return Float TEST RUN1 1 2 3 4 5 6 7 8 9 10 START POINT 1061631635902 1061631655961 1061631661689 1061631665425 1061631669651 1061631673887 1061631677622 1061631681388 1061631684843 1061631688818 END POINT 1061631637835 1061631656512 1061631662190 1061631665905 1061631670122 1061631674368 1061631678103 1061631681868 1061631685313 1061631689299 1.933 0.551 0.501 0.480 0.471 0.481 0.481 0.480 0.470 0.481 TEST RUN2 START POINT 1061632047334 1061632067704 1061632072040 1061632075815 1061632079601 1061632083256 1061632102894 1061632106760 1061632110125 1061632113620 END POINT 1061632049567 1061632068254 1061632072510 1061632076296 1061632080292 1061632083787 1061632103425 1061632107290 1061632110595 1061632114120 2.233 0.550 0.470 0.481 0.691 0.531 0.531 0.530 0.470 0.500 TEST RUN3 START POINT 1061632474819 1061632491162 1061632495499 1061632509579 1061632513551 1061632530525 1061632534881 1061632538296 1061632543284 1061632548461 END POINT 1061632477032 1061632491713 1061632496100 1061632510420 1061632514332 1061632531056 1061632535362 1061632538777 1061632543814 1061632549262 2.213 0.551 0.601 0.841 0.781 0.531 0.481 0.481 0.530 0.801 Return Double TEST RUN 1 1 2 3 4 5 6 7 8 9 10 START POINT 1061628329049 1061628364289 1061628369677 1061628374644 1061628379581 1061628384288 1061628388374 1061628417376 1061628421732 1061628426379 END POINT 1061628330881 1061628364790 1061628370328 1061628375115 1061628380122 1061628384759 1061628389025 1061628417846 1061628422253 1061628426859 1.832 0.501 0.651 0.471 0.541 0.471 0.651 0.470 0.521 0.480 TEST RUN2 START POINT 1061628951782 1061628990949 1061628995265 1061628999341 1061629003026 1061629019620 1061629023005 1061629026750 1061629030175 1061629033730 END POINT 1061628954015 1061628991499 1061628995796 1061628999821 1061629003727 1061629020141 1061629023475 1061629027221 1061629030706 1061629034221 2.233 0.550 0.531 0.480 0.701 0.521 0.470 0.471 0.531 0.491 TEST RUN3 START POINT 1061629483687 1061629498749 1061629504227 1061629536022 1061629540339 1061629558625 1061629563021 1061629566676 1061629570292 1061629573646 END POINT 1061629485910 1061629499350 1061629504757 1061629536493 1061629541050 1061629559486 1061629563552 1061629567147 1061629570762 1061629574127 2.223 0.601 0.530 0.471 0.711 0.861 0.531 0.471 0.470 0.481 164
  • Michael Wong 151220 Return Byte 1 2 3 4 5 6 7 8 9 10 Test Run 1 Start Point 1061588234000 1061588238566 1061588242802 1061588246898 1061588250884 1061588254669 1061588261419 1061588266036 1061588281628 1061588285424 End Point 1061588234541 1061588239047 1061588243283 1061588247379 1061588251455 1061588255150 1061588261920 1061588266597 1061588282139 1061588285904 (forgot to restart server) 0.541 0.481 0.481 0.481 0.571 0.481 0.501 0.561 0.511 0.48 Test Run 2 Start Point 1061590230488 1061590236917 1061590244959 1061590250427 1061590254763 1061590258899 1061590262754 1061590268062 1061590271988 1061590275523 End Point 1061590232831 1061590237758 1061590245720 1061590250957 1061590255244 1061590259370 1061590263225 1061590268733 1061590272458 1061590275993 2.343 0.841 0.761 0.530 0.481 0.471 0.471 0.671 0.470 0.470 Test Run 3 Start Point 1061591060343 1061591079030 1061591115052 1061591120349 1061591125226 1061591131455 1061591153267 1061591158174 1061591162180 1061591165955 End Point 1061591062556 1061591079541 1061591115573 1061591121451 1061591125927 1061591131976 1061591153737 1061591158644 1061591162750 1061591166436 2.213 0.511 0.521 1.102 0.701 0.521 0.470 0.470 0.570 0.481 Test Run 1 (retest) Start Point 1061591833835 1061591862306 1061591867614 1061591871860 1061591876106 1061591903756 1061591908503 1061591914121 1061591918056 1061591922373 End Point 1061591836048 1061591862877 1061591868565 1061591872351 1061591876807 1061591904277 1061591909033 1061591914601 1061591918527 1061591922863 2.213 0.571 0.951 0.491 0.701 0.521 0.530 0.480 0.471 0.490 165
  • Michael Wong 151220 Appendix K : JSB Interaction test results (averages) Test Case1 One Way Request TEST NUMBER 1 2 3 4 5 6 7 8 9 10 3.554 2.302 2.293 2.328 2.503 2.331 2.277 2.29 2.319 2.336 Test Case 2 : Update By Polling Test Sequence 1 2 3 4 5 6 7 8 9 10 Time (s) 0.821 0.101 0.070 0.070 0.070 0.321 0.220 0.080 0.130 0.040 Test Sequence 11 12 13 14 15 16 17 18 19 20 Time (s) 0.050 0.050 0.070 0.030 0.040 0.040 0.040 0.050 0.050 0.090 Test Case 3 : Check/Poll and Response/Update Test Sequence 1 2 3 4 5 6 7 8 9 10 Time (s) 2.424 0.08 0.06 0.08 0.07 0.14 0.07 0.07 0.05 0.071 Test Sequence 11 12 13 14 15 16 17 18 19 20 Time (s) 0.08 0.04 0.06 0.04 0.04 0.04 0.04 0.11 0.3 0.04 Test Case 4 : Collect and Update Test Sequence 1 2 3 4 5 6 7 8 9 10 Time (s) 3.355 2.984 3.125 2.894 1.583 2.984 2.974 3.084 2.844 2.884 166