GWTEventService gibt uns die Möglichkeit Events am Server auszulösen und diese direkt an alle Clients zu senden. Das ersparrt den Aufwand selber einen Polling-Mechanismus zu implementieren.
In diesem Beispiel will ich eine kurze Übersicht über den grundsätzlichen Aufbau von GWTEventService geben. Als Beispiel dient uns hierbei ein ganz einfaches Chatsystem, ohne großen SchnickSchnack.
Als erstes brauchen wir ein Event im Client:
public class MyEvent implements Event {
public String message;
public MyEvent(){}
public MyEvent(String message) {
this.setMessage(message);
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Dieses Event wird abgefeuert wenn der Server eine neue Nachricht rein bekommt.
Um auf dieses Event reagieren zu können brauchen wir auf der Client-Seite einen entsprechenden EventListener:
public class MyListener implements RemoteEventListener {
/**
* This function gets called by EventService
*/
public void apply(Event anEvent) {
/**
* Check if the incoming Event is from the type MyEvent
* and if so, call the corresponding function
*/
if(anEvent instanceof MyEvent)
onMyEvent((MyEvent)anEvent);
}
/**
* This function gets called when the incomming Event is
* from the Type MyEvent
*
* @param event
*/
public void onMyEvent(MyEvent event){}
}
Diesen EventListener müssen wir jetzt mit dem Server bekannt machen.
/**
* The domain to which we want to register our listener to
*/
private static final Domain DOMAIN = DomainFactory.getDomain("my_domain");
public void onModuleLoad() {
/**
* Create an EventService
*/
RemoteEventServiceFactory theEventServiceFactory = RemoteEventServiceFactory.getInstance();
RemoteEventService theEventService = theEventServiceFactory.getRemoteEventService();
/**
* Register our listener to the domain
*/
theEventService.addListener(DOMAIN, new MyListener(){
public void onMyEvent(MyEvent event){
/**
* Get the message from the event and append it
* to the allready received messages
*/
getIncommingMessages().setText( getIncommingMessages().getText() + event.getMessage() + "n" );
}
});
[.....]
}
Wir registrieren den EventListener und sagen ihm was passieren soll wenn unser Event gefeuert wird. Domains werden benutzt um Events eines bestimmten Kontexts zu erhalten. Wenn wir den Chat beispielsweise um Räume erweitern wollten, dann würde man die den Raum in dem man sich befindet als Domain angeben und würde nur Nachrichten aus diesem Raum erhalten.
Als letztes brauchen wir noch unsern Server der das Event abfeuert.
public class HelloWorldServiceImpl
extends RemoteEventServiceServlet
implements HelloWorldService {
/**
* The Domain that this Service sends Events to.
*/
private static final Domain DOMAIN = DomainFactory.getDomain("my_domain");
/**
* A normal function that gets called when a client sends a message to the server.
*/
public void sendMessage(String message) {
/**
* We dont save the incomming messages on the
* server. We just send an MyEvent to all
* registered Listeners on the Domain.
*/
this.addEvent(DOMAIN, new MyEvent(message));
}
}
Anstelle von RemoteServiceServlet erbt unser Servlet von RemoteEventServiceServlet aus der GWTEventService lib. Dadurch haben wir die Möglichkeit Events abzufeuern.
Das Beispiel ist natürlich nur eine grobe Übersicht über die Möglichkeiten die GWTEventService bietet, um einen Blick in die Doku wird man wohl nicht herum kommen.
Photo:

Toll!
super