JBoss.orgCommunity Documentation

Chapter 3. Client-Server Event Example

A key feature of the Errai CDI framework is the ability to federate the CDI eventing bus between the client and the server. This permits the observation of server produced events on the client, and vice-versa.

Example server code:

Example 3.1. MyServerBean.java

@ApplicationScoped

public class MyServerBean {
  @Inject
  Event<MyResponseEvent> myResponseEvent;
  public void myClientObserver(@Observes MyRequestEvent event) {
    MyResponseEvent response;
    if (event.isThankYou()) {
      // aww, that's nice!
      response = new MyResponseEvent("Well, you're welcome!");
    }
    else {
      // how rude!
      response = new MyResponseEvent("What? Nobody says 'thank you' anymore?");
    }
    myResponseEvent.fire(response);
  }
}

Domain-model:

Example 3.2. MyRequestEvent.java

@ExposeEntity

public class MyRequestEvent {
  private boolean thankYou;
  public MyRequestEvent(boolean thankYou) {
    setThankYou(thankYou);
  }
  public void setThankYou(boolean thankYou) {
    this.thankYou = thankYou;
  }
  public boolean isThankYou() {
    return thankYou;
  }
}

Example 3.3. MyResponseEvent.java

@ExposeEntity

public class MyResponseEvent {
  private String message;
  public MyRequestEvent(String message) {
    setMessage(message);
  }
  public void setMessage(String message) {
    this.message = message;
  }
  public String getMessage() {
    return message;
  }
}

Client application logic:

Example 3.4. MyClientBean.java

@EntryPoint

public class MyClientBean {
   @Inject
   Event<MyRequestEvent> requestEvent;
   public void myResponseObserver(@Observes MyResponseEvent event) {
     Window.alert("Server replied: " + event.getMessage());
   }
   @PostConstruct
   public void init() {
     Button thankYou = new Button("Say Thank You!");
     thankYou.addClickHandler(new ClickHandler() {
       public void onClick(ClickEvent event) {
         requestEvent.fire(new MyRequestEvent(true));
       }
     }
     Button nothing = new Button("Say nothing!");
     nothing.addClickHandler(new ClickHandler() {
       public void onClick(ClickEvent event) {
         requestEvent.fire(new MyRequestEvent(false));
       }
     }
     VerticalPanel vPanel = new VerticalPanel();
     vPanel.add(thankYou);
     vPanel.add(nothing);
     RootPanel.get().add(vPanel);
   }
}