Java Reference
In-Depth Information
Our endpoint is defined in the /tickets address. We injected a SessionReposit-
ory to our endpoint. During @OnOpen , we add Sessions to the registry, and during
@OnClose , we just remove them. Message sending is performed on the CDI event (the
@Observers annotation), which is already fired in our code during
TheatreBox.buyTicket(int) . In our send method, we retrieve all sessions from
SessionRepository , and for each of them, we asynchronously send information
about booked seats. We don't really need information about all the Seat fields to realize
this feature. That's the reason why we don't use the automatic JSON serialization we know
from the last chapter here. Instead, we decided to use a minimalistic JSON object, which
provides only the required data. To do this, we used the new Java API for JSON Process-
ing (JSR-353). Using a fluent-like API, we're able to create a JSON object and add two
fields to it. Then, we just convert JSON to the string, which is sent in a text message.
Because in our example we send messages in response to a CDI event, we don't have (in
the event handler) an out-of-the-box reference to any of the sessions. We have to use our
sessionRegistry object to access the active ones. However, if we would like to do
the same thing but, for example, in the @OnMessage method, then it is possible to get all
active sessions just by executing the session.getOpenSessions() method.
These are all the changes required to perform on the backend side. Now, we have to modi-
fy our AngularJS frontend to leverage the added feature. The good news is that JavaScript
already includes classes that can be used to perform WebSocket communication! There
are a few lines of code we have to add inside the module defined in the seat.js file,
which are as follows:
var ws = new WebSocket("ws://localhost:8080/
ticket-agency-websockets/tickets");
ws.onmessage = function (message) {
var receivedData = message.data;
var bookedSeat = JSON.parse(receivedData);
$scope.$apply(function () {
for (var i = 0; i < $scope.seats.length; i++) {
if ($scope.seats[i].id === bookedSeat.id) {
$scope.seats[i].booked = bookedSeat.booked;
break;
}
}
Search WWH ::




Custom Search