CDI event qualifiers
The Errai CDI integration module (see a previous blog post) has support for event qualifiers now, both for event producers and observers. Multiple qualifiers can be specified for an event and of course custom qualifiers can be used.
CDI conversations
The simple use of @Conversational allows a server to directly address a single client in response to an event.
BusReadyEvent
Clients can observe a BusReadyEvent to be notified when the CDI event system has been initialized and the message bus is ready to be used.
The example code below shows how to use these new features. Notice again the use of a uniform API on both the client and server. For more details on Errai's CDI support see the online documentation. Any feedback is appreciated!
@EntryPoint
public class SimpleDocumentClient extends LayoutPanel {
@Inject
private Event<DocumentSubscription> documentSubscriptionEvent;
@Inject @Published
private Event<Document> publishedDocumentEvent;
public void buildUI(@Observes BusReadyEvent busReadyEvent) {
documentSubscriptionEvent.fire(new DocumentSubscription());
// ...
new Button().addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
publishedDocumentEvent.fire(new Document());
}
});
}
public void onDocumentsReceived(@Observes Documents document) {
// this event is received as a direct response to the subscription event
// ...
}
public void onDocumentCreated(@Observes @New Document document) {
// ...
}
public void onDocumentUpdated(@Observes @Updated Document document) {
// ...
}
public void onDocumentDeleted(@Observes @Deleted Document document) {
// ...
}
}
@ApplicationScoped
public class SimpleDocumentService {
@Inject
private Event<Documents> subscriptionResponseEvent;
@Inject @New
private Event<Document> documentCreatedEvent;
@Inject @Updated
private Event<Document> documentUpdatedEvent;
@Inject @Deleted
private Event<Document> documentDeletedEvent;
@Conversational
public void onDocumentSubscription(@Observes DocumentSubscription subscription) {
Documents documents = new Documents();
//...
// respond to the client directly
subscriptionResponseEvent.fire(documents);
}
public void onDocumentPublished(@Observes @Published Document document) {
// receive document published events from the clients
//...
}
private void createDocument(Document document) {
// ...
documentCreatedEvent.fire(document);
}
private void updateDocument(Document document) {
// ...
documentUpdatedEvent.fire(document);
}
private void deleteDocument(Document document) {
// ...
documentDeletedEvent.fire(document);
}
}