Date: Fri, 29 Mar 2024 11:12:02 +0000 (UTC)
Message-ID: <723062455.21.1711710722147@c2f7cba36625>
Subject: Exported From Confluence
MIME-Version: 1.0
Content-Type: multipart/related;
boundary="----=_Part_20_1910091169.1711710722146"
------=_Part_20_1910091169.1711710722146
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Content-Location: file:///C:/exported.html
Description
SmartGWT already has a real-time strea=
ming technology we call SmartGWT Messaging, but there are other frameworks/=
technologies that you can use to achieve the same goal. One of such framewo=
rks is the Atmosphere real-time streaming framework: https://github.com/Atmosphere/atmosphere
We have taken the Atmosphere real-time=
streaming framework to demonstrate ow to integrate it with a SmartGWT grid=
. For that, we have made a version that uses Atmosphere of the sample code =
that can be found here: http://www.smartclient.com/smartgwte=
e/showcase/#messaging_stock_quotes
The sample application h=
as been deployed and tested on glassfish 3.1.2, with Google Plugin for Ecli=
pse, and also has been tested as standalone running codeserver from command=
line via Maven.
Setting up<=
/h1>
Setting u=
p libraries
As we are using maven for this=
project, there is only a few values to setup. We rely on Maven plugin to download the required version of the smartgwt libraries. In order =
to install the smartgwt libraries in your local maven repository, execute t=
he maven goal =E2=80=9Cisc:install=E2=80=9D, from command line or from ecli=
pse, before you compile and run the project for the first time.
You need to execute that goal =
each time you need to link your project to a different version of SmartGWT.=
To change to a specific versio=
n of SGWT you must redefine these properties in the provided pom.xml:
smartgwt.version |
The smartgwt version (included=
p|d suffix). I.e. 6.0p |
smartgwt.date |
Smartgwt build date, in =E2=80=
=9Cyyyy-mm-dd=E2=80=9D format. I.e. 2016-09-21 <=
/td>
|
smartgwt.build |
Smartgwt build number, in =E2=
=80=9CX.Y-(p|d)yyyymmdd=E2=80=9D format. I.e. 6.0-p2016092=
1 |
You can start codeserver, in o=
rder to test the application in SuperDev Mode, from command line:
To test, just navigat=
e to http://127.0.0.1:8888/indexSD.html
Se=
tting up project structure
When you uncompress the =
contents of the provided zip, you will find the following folder structure,=
that follows the proposed structure for a maven web project:=
The java folde=
r contains the required java source code, both server (jersey resource, ser=
vlet), client (the SmartGWT application) and the new API that provides acce=
ss from GWT to the atmosphere javascript API.
The webapp/=
ds directory contains the =
demo data needed to initialize the application. It was copied from the orig=
inal SmartGWT demo application.
The webapp/WEB-INF=
folder contains the deployment d=
escriptor web.xml, described later in this document.
The webapp fol=
der contains two html landing pages: besides the standard index.html we pro=
vide indexSD.html, a version that explicitly includes the code to load the =
smartclient js modules as required by the Super Dev mode, so navigate to th=
is page instead of the standard index.html when testing from eclipse or fro=
m the codeserver.
You can compile the proj=
ect inside eclipse with the provided pom.xml file, or call d=
irectly mvn from command line, invoking the =E2=80=9Cpackage=E2=80=9D phase=
. If you are using eclipse with Google Plugin for Eclipse and M2Eclipse, im=
port the project into eclipse as =E2=80=9CMaven > Existing Maven Project=
s=E2=80=9D. Once imported, open =E2=80=9CProject > Properties=E2=80=9D, =
under the =E2=80=9CGoogle=E2=80=9D pane check the option =E2=80=9CThis proj=
ect has a WAR directory=E2=80=9D inside =E2=80=9CWeb Application=E2=80=9D a=
nd =E2=80=9CUse GWT=E2=80=9D under =E2=80=9CWeb Toolkit=E2=80=9D. Do not fo=
rget to add the GWT library to the Java Build Path. M2Eclipse will maintain=
the eclipse build path always synchronized.
The atmosphere GWT API (wrapper)
Atmosphere 2.4 provides a wrap=
per around the jQuery.atmosphere.j=
s library that allows GWT =
2.0 applications to access the library. But, unfortunately, it is only prov=
ided as binary, and as it has been compiled against GWT version 2.6, it can=
not be used with GWT>2.6. So, we have implemented our own wrapper class,=
providing a simple set of wrapper methods to access the javascript library=
. The source code for this wrapper is provided as part of this sample.
The wrapper is coded int=
o a separate GWT module (isoatmos)=
, under the com.isomorphic.atmosphere package. That way it can be packaged and used in=
different projects.
The API
The API provides these two met=
hods:
JavaScriptObject subscribe(Configurato=
r) |
This method is used from the c=
lient to subscribe to server events.
A Configurator =
is a java object used to configure the subscription, that also allows to re=
gister callback methods, as described below.
Once a client is subscribed to a channel, each time the client receives a m=
essage sent from the server to our client, the atmosphere framework will ca=
ll the =E2=80=9ConMessage()=
=E2=80=9D callback method, that w=
e registered when we configured the connection.
The subscribe() method returns a Javascript object, the socket, that can b=
e used to push data to server at any moment. |
void pushData(JavaScriptObject socket,=
JSONObject data) |
This method allows to send dat=
a to the server from our GWT application at any moment.
The socket obj=
ect is the one that we obtained when we subscribed to the channel with the =
subscribe() method.
The data field is a JSON Objec=
t, it may contain whatever we want to send to the server encapsulated as a =
json object. |
void unsubscribe() |
Stop receiving messages from A=
tmosphere. |
The Configurator class provides these methods:
setService() |
The identifier of the service =
set when we configured the AtmosphereServlet. By default, we set it to =E2=
=80=9Cjersey/rpc=E2=80=9D, and can be changed in web.xml deployment descriptor. |
setChannelId() |
The identifier of the channel =
to use. Can be a generic identifier, of we want to be notified of all messa=
ges sent by the server, or a specific one, so we will only receive messages=
addressed to us. |
setTransport() |
Transport protocol. We use streaming by default. |
setFallbackTransport() |
In case the selected transport=
protocol is not available in both sides (client and server), the framework=
will negotiate to find the next common protocol. This is our preferred pro=
tocol in case the first one is not available. By default is long-polling. |
setMessageHandler(IAtmosphereMessageHandler handler) |
IAtmosphereMessageHandler is an interface that all MessageHandlers must implement. The interface only has one method, onMessage(JavaScriptObject response). Once the handler is register=
ed, the method will be invoked each time a new message arrives to the clien=
t. |
The IAtmosphereMessageHandler interface only provides one method:
void onMessage(String response)=
|
This is a callback method, tha=
t is invoked by the framework when a new message is received on our GWT 2.0=
application from the server.
The received response is a Stringified JSON object. To retrieve the origina=
l object, you can use =E2=80=9CJSONParser=E2=80=9D, as in this example:
=E2=80=A6
JSONObject jsonResponse =3D
(JSONOb=
ject) JSONParser.parseLenient(response);
JSONArray jsonStockData =3D (JSONArray=
)jsonResponse.get("stockData");
=E2=80=A6 |
Using the API
The first step is to subscribe=
the application to receive events from the server. For that, we must use a=
Configurator object.
The channelId can be an empty =
or constant String. All clients with the same channelId will receive the sa=
me broadcasted messages. If we want to receive server events addressed to o=
ur client, we must provide a unique channelId.
Together with the channelId, w=
e setup the transport methods, and also provide a class implementing the &n=
bsp;AtmosphereMessageHandler interface. The class just imple=
ments one method, onMessage(), that is going to be called by=
the framework each time a server event is received.
... final String channelId =3D "myChannel"; Configurator configurator =3D new Configurator(); =
span>configurator.setService("jersey/rpc"=
); configurator.setChannelId(ch=
annelId); configurator.setTrans=
port(Configurator.TRANSPORT_STREAMING); configurator.setFallbackTransport(Configurator.TRANSPORT_LONG_POLL=
ING); configurator.setMessageHa=
ndler(new SampleMessageHandler());
<=
/span>// Start listening remote events AtmosphereWrapper.subscribe(configurator); =E2=80=A6 |
This is an example of an AtmosphereMessageHandler class:
=E2=80=A6 public class SampleMessageHandler implements IAtmosphereMes=
sageHandler { protected Sample=
MessageHandler() { }
<=
/span> @Override public final =
void onMessage(JavaScriptObject response) { logger.log(=E2=80=9CMessage received=E2=80=9D);
}
} |
The Jersey=
resource
This is part of the server sid=
e of the application, and in our application will be used only to register =
the subscription of a new client. We only need to define one method here, t=
he one to accept the subscription (with the @GET annotation, as the atmosph=
ere =E2=80=9Csocket.subscribe()=E2=80=9D method sends a GET =
request).
public class JerseyRpc { =E2=80=A6 @GET @Produces("ap=
plication/json") public Suspen=
dResponse<String> suspend() { =E2=80=A6 }
=E2=80=A6 } |
In order to respond ONLY to th=
e clients that subscribed to this channel, when a client subscribes to the =
jersey resource, the client generates a channel identifier for this client.=
This identifier arrives as part of the path used to locate the jersey reso=
urce during the registration. So we must configure our Jersey resource this=
way:
@Path("/rpc/{channelid}")
public class JerseyRpc { private @PathParam("channelid") =E2=80=A6 } |
Chan=
ges in the application
The GWT EntryPoint class that =
we are using is basically the same that you can find here. The main changes that we had to do to the application foll=
ows.
First, we have included the co=
de to subscribe the application to the atmosphere channel that we defined i=
n our jersey resource. In this example we are adding a value to the channel=
Id, the startParameter, based on current time.
public void onModuleLoad() {
=E2=80=
=A6
<=
/span>final long startParameter =3D System.currentTimeMillis();
=E2=80=
=A6
<=
/span>final String channelId =3D "channel." + startParameter;
<=
/span>Configurator configurator =3D new Configurator();
<=
/span>configurator.setService("jersey/rpc");
<=
/span>configurator.setChannelId(channelId);
<=
/span>configurator.setTransport(Configurator.TRANSPORT_STREAMING);=
p>
<=
/span>configurator.setFallbackTransport(Configurator.TRANSPORT_LONG_POLLING=
);
<=
/span>configurator.setMessageHandler(new MyMessageHandler());
<=
/span>// Start listening remote events
<=
/span>AtmosphereWrapper.subscribe(configurator);
=E2=80=
=A6
} |
The IAtmosphereMessageHandler implemetation provided, AtmosphereMessageHandler, just calls the original upda=
teStockQuotes() method.
public class AtmosphereMessageHandler =
implements IAtmosphereMessageHandler {
protect=
ed AtmosphereMessageHandler() {
}
<=
/span>@Override
<=
/span>public final void onMessage(String response) {
<=
/span> AtmosphereSample.updateSt=
ockQuotes(response);
<=
/span>}
} |
The second change was applied =
to the servlet that processes the request to start sending back data, the <=
/span>StockQuotesServlet, to replace the calls to the SmartGWT Mess=
aging service with calls to atmosphere service. First we need to retrieve t=
he atmosphere channel that we want to communicate to, based on the startPar=
ameter:
public void processRequest(HttpServlet=
Request request,
<=
/span> HttpServletResponse response) throws ServletException, I=
OException {
=E2=80=
=A6
ServletContext servletContext =
=3D ServletContextFactory.getDefault().getServletContext(); BroadcasterFactory bf =3D <=
span data-colorid=3D"lg5ecxa14w"> (BroadcasterFactory) servletContext.getAttribute("org.atmosphere.cpr=
.BroadcasterFactory"); <=
span data-colorid=3D"izrh3rn6ly"> Broadcaster channel =3D bf.=
lookup(channelId); =E2=
=80=A6
} |
Then, after we have created th=
e data block to be sent to the client as we did before, we broadcast an atm=
osphere message to this channel.
public void processRequest(HttpServlet=
Request request,
<=
/span> HttpServletResponse response) throws ServletException, I=
OException {
=E2=80=
=A6
JsonRes=
ponse response =3D new JsonResponse(stockData);
<=
/span> channel.broadcast(respons=
e);
=E2=80=
=A6
} |
To encapsulate the data we cre=
ated a class, JsonResponse, that just holds the stockData (We have added th=
e @XmlRootElement annotation to assure that both json and XML can be genera=
ted, but it is not mandatory):
=E2=80=A6
@XmlRootElement
public class JsonResponse {
public =
List<Object[]> stockData;
public =
JsonResponse() {}
public =
JsonResponse(List<Object[]> stockData) {
this.st=
ockData =3D stockData;
}
} |
=
span>
The third change we have done =
in the legacy application is in the method that receives the updates from t=
he server, updateStockQuotes(). The main change we made ther=
e was to adapt the format of the received data to the required format, beca=
use, as we are receiving raw json data, we have to do some transformation.<=
/span>
public static void updateStockQuotes(S=
tring responseBody) {
<=
/span>JavaScriptObject jsoResponseBody =3D JSON.decode(responseBody);
<=
/span>Map<?,?> rp =3D (Map<?,?>) JSOHelper.convertToJava(jsoRes=
ponseBody);
<=
/span>List<List<?>> stockData =3D (List<List<?>>) r=
p.get("stockData");
=E2=80=
=A6
} |
Oth=
er configuration issues
We need to take into account o=
ne configuration file: web.xml, where we need to configure the jersey resou=
rce. Also, we have had to configure the StockQuotesServlet.
<?xml version=3D"1.0" encoding=3D"U=
TF-8"?>
<web-app =E2=80=A6>
<servlet>
&=
nbsp;<description>AtmosphereServlet</description>
&=
nbsp;<servlet-name>AtmosphereServlet</servlet-name>
&=
nbsp;<servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-=
class>
&=
nbsp;<init-param>
&=
nbsp; <param-name>com.sun.jersey.config.proper=
ty.packages</param-name>
&=
nbsp; <param-value>com.isomorphic.examples.atm=
osphere.server, org.codehaus.jackson.jaxrs</param-value>
&=
nbsp;</init-param>
&=
nbsp;<init-param>
&=
nbsp; <param-name>org.atmosphere.websocket.mes=
sageContentType</param-name>
&=
nbsp; <param-value>application/json</param-=
value>
&=
nbsp;</init-param>
</servlet>
<servlet> &nb=
sp;
&=
nbsp;<servlet-name>StockQuotesServlet</servlet-name>
&=
nbsp;<servlet-class>com.isomorphic.isoatmosjersey.server.StockQuotesS=
ervlet</servlet-class>
</servlet>
<servlet-mapping=
>
&=
nbsp;<servlet-name>AtmosphereServlet</servlet-name>
<=
/span> <url-pattern>/jerse=
y/*</url-pattern>
</servlet-mappin=
g>
<servlet-mapping=
>
&=
nbsp;<servlet-name>StockQuotesServlet</servlet-name>
<=
/span> <url-pattern>/examp=
les/StockQuotes/generate</url-pattern>
</servlet-mappin=
g>
</web-app> |
Testing
To test the application, packa=
ge and deploy it to your preferred application server. In case you want to =
test it with glassfish, you only need to execute the ant build.xml file pro=
vided, or manually =E2=80=9Cgwt compile=E2=80=9D the project, then zip the =
=E2=80=9Cwar=E2=80=9D folder into a war file, for instance isoatmosjersey.w=
ar. Once you have the .war file, deploy it into glassfish as usual, then vi=
sit the application=E2=80=99s url, for instance http://=
localhost:8080/isoatmosjersey/
You should see a screen like t=
his, with stock quotes changing dynamically:
=
In case you want to test it fr=
om command line, using codeserver, you can just execute this from the uncom=
pressed folder:
<=
/span>
You can find the d=
escribed project in this zip: SGWT_Atmosphere_2.4.6.zip
------=_Part_20_1910091169.1711710722146
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: file:///C:/58c009b617be643edefce62d71b2f7b6baa21e2caf0be9890c82272b94b46fcc
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
a59tP+0g7BDt0ONI7ejuWOO46aTvlOs06yzlfMx5wIXVJcil1RXt6uha6brhZuB2wW3RXcE9zX38
kNChI4cee7B6hHp0eFJ7enve9kJ6OXnVeu16W3mXe2/4mPgU+6zh9fAX8R99tX3zfJf9NPxy/Zb8
Nfxz/d8HaAScD1gO1ArMD1wJ0gsqDPoSbBxcGrwZYhVSFbIf6hTaEIYJ8wq7G04XHhLeG8EZcSRi
hCBGSCPMHlY9fOHwGtGMWBkJRR6KbI3CkZKbp9HC0Sej52I0Y4pitmIdY28foT0SfuRpnGhcetxS
vGH8tQREAj6h5yjP0eSjc8d0jpUdh477HO9J5EtMTVxMMkqqTiZPDkl+liKdkpvy7YTTibZUjtSk
1IWTRifr0qjSiGkTp9ROlZ5GnA46PZgul34p/WeGb8aTTOnM/MzdLHzWkzMyZwrO7J/1PzuYrZhd
koPKCc8ZP6d1rjqXNjc+d+G8xfnmPO68jLxvFzwvPM6Xzy+9SH4x+uJsgXlB6yX+SzmXdgsDC18U
6RY1FLMXpxdvXva9PFqiXXKjlKM0s/THlaArk2VGZc3lguX5FaiKmIp3Vx2v9l9TvlZTyVqZWblX
FV41W21b3VujVFNTy16bXQeri65brnevH76uf731hsSNsgbGhsyb4Gb0zQ+3vG6NN5o19txWvn3j
jsCd4ib6poxmqDmuea0lsGW21aV15K7p3Z42tbame5L3qtp52os6GDqyO8k7Uzv378ff3+gidK10
B3Qv9Hj2TD9wfjDWa9M72GfW9+ih4cMH/Tr99x9pPGp/rPr47hPlJy0DigPNTxWeNj1TeNY0qDjY
PKQ01DqsMtw2oj7SOao12v1c//nDMZOxgReWL0bGHcYnJ9wnZid9J9+/DH35ZSpmamc6aQY5k/GK
5lX+a/bX5W9E3jTMKs52zOnPPZ23m59ewC98fBv5dncx9R3lu/wlrqWa97Lv25cNl4c/uH1Y/Ej4
uLOStkq7WvxJ+NOdz9qfn645ry1+IX7ZX8/6yvK16pv8t54N643X38O+72xmbLFsVW8rb/f/cPqx
tBO7i94t2BPZa/tp9nNmP2x/n+BN9P6dCsBJDebvD8B6FSlPIOUK9MMAkFP9yYn/W+Ck5ANGulIB
HXAF4oQuw1RgH+HXEclIPMoR7YzxIUshL8b2UWxScVBb0RyjbaAbp99lwDGKM6kwW7F4sEaxZbFf
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
J2UqCzKzsrNyc/ILCm8V55VmlV+pTKvOqM2qL2msae5pU+hw6SroWegHG5wxbDJ6Z8Jh6mJWZD5r
KWIVbd1ny2JHsB9wFHHKdF51tXKrP4TwcPas9drzscPX+2H8AwKeBEkHF4aiwqLC3xJsD3dGCkWd
iV6PdT7SFS+acPEY+nhc4mqyX8qbVLeTU6dcTk9mOGWOn3E8O5njfm6elHd+z08twF2qKlIvHinx
K/1SFln+8arbtYdVktV5Nbt1/vUjN7QaGm5xN+bdwTaltoDWpDb4vYwOhs7yLpnuBw+celcennjE
/rhlwO7p6mDaMOvIteciY1Xj3BP5Lymmkqe3XhFeL8/6zr1ZcH078c5uaWjZ7EP/it5q12eNtfZ1
9a8dG9rfe7dMt0d33HYXfxJ/xT/SX0729/EBUegCgHy9v/+VdG6gcwHYO7e/v1O+v79XQSo2ZgDo
Cv3zvf33WUMDQHH7L3oY6EX4v797/xeQLHJV0yw38QAAAgRpVFh0WE1MOmNvbS5hZG9iZS54bXAA
AAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3Jl
IDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAy
LzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIK
ICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAg
ICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj4KICAg
ICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjEzNzwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAg
ICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNTQ8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgog
ICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3Jk
ZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KlgsU1AAAHjJJREFUeAHt
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
------=_Part_20_1910091169.1711710722146--