summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/tags/2.0.1-RC1/samples/learning-more/binding-websocket/weather-webapp/README
blob: eb195bc4dc9d252b40163ad5a44e7a907fb48ccf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
Tuscany - Learning More - Binding Websocket - Weather Monitor Webapp
-----------------------------------------------------------------

This sample demonstrates how Tuscany can expose services via websockets as well
as how to interact with them using Tuscany's javascript API. It also demonstrates
how to push multiple responses for a single request using SCA callbacks.

This project contains multiple services that once called will push notifications
to the client regarding certain weather parameters according to the location of
the user. Of course, the service implementation is a mock that generates random
numbers at a fixed interval of time as weather parameters.

By adding <tuscany:binding.websocket port="8090"/> to a service definition, the 
Tuscany runtime will start a websocket server listening for requests coming
in for the exposed service at the specified port. If no port is specified, the
runtime will use port 9000 as a default.  

The websocket binding uses embedded Jetty instances as websocket servers. At the
moment, Jetty 8.0.0-M3 is used which has support for the 00, 01, 06 and 07 
versions of the websocket protocol drafts. 

IN ORDER TO RUN THIS SAMPLE SUCCESSFULLY PLEASE CHECK IF YOUR BROWSER SUPPORTS 
THE ABOVE WEBSOCKET PROTOCOL VERSIONS AND THAT THE WEBSOCKET SUPPORT IS ENABLED.

In order to enable callbacks to push multiple responses, you need to declare the 
WebsocketBindingCallback in the service definition as follows:

    <interface.java interface="sample.ChatService"
                    callbackInterface="org.apache.tuscany.sca.binding.websocket.runtime.WebsocketBindingCallback" />
    <tuscany:binding.websocket />
    <callback>
        <tuscany:binding.websocket />
    </callback>
    
The callback object has methods that facilitate sending messages back to the 
calling client. It can be injected in the service implementation using the @Callback
annotation.

One requirement that service methods have to meet to enable multiple response 
support is that they have to be annotated with @OneWay to enable non-blocking 
support. Without it, methods are treated synchronously sending a single response
which is the object returned by the method call.  

The websocket binding also features a javascript API to simulate SCA in the 
browser. In order to use it, the following script has to be included in the
client page: 
    <script type="text/javascript" 
            src="org.apache.tuscany.sca.WebsocketComponentContext.js">
    </script>
	
This will inject proxies for all services defined in the composite that are 
using binding.websocket. All invocation and connection management is handled
under the hood so in order to invoke a websocket service, the following should
be called:
	Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>(<parameters>);

Given the asynchornous nature of websockets, a function should be defined in
order to handle responses received for a certain service operation. This should
be done as follows:
    Tuscany.WebsocketComponentContext.<component name>.<service name>.<operation name>.responseHandler = function(response) {
        // handle response
    };
	
Note that the data exchange is automatically handled by the binding, so parameters 
will be mapped to the data types defined in the method definition. Also, the response 
will have the same data type as the server side object used to wrap the response. 
Objects are passed over the wire in JSON format.

Another detail worth mentioning is that the binding will use a single persistent 
websocket connection to handle communication between a browser client and all services 
defined using binding.websocket on the same port. Requests and responses will get
multiplexed via the same channel and get routed to the appropriate service 
implementation, respectively javascript function.

In order to run the sample, you can execute "mvn jetty:run" which will start a Jetty
instance automatically or use "mvn package" and deploy the resulting war to the
application server of your choice.

Next, point your browser at 
    http://localhost:8080/sample-binding-websocket-weather-webapp/
	
You can now set a location and register for various weather parameters. Notifications 
will be pushed to the browser when weather parameters change. You can see the persistent 
websocket connection handling all the communication using the developer tools provided 
by your browser.

The websocket binding is an experimental binding so community feedback is much 
appreciated. Feel free to send comments or suggestions on the Apache Tuscany 
dev mailing list (dev@tuscany.apache.org).