Errai Bus(新手) - 没有CDI - Quick Q.

时间:2013-05-30 22:40:53

标签: errai

Errai似乎是一个非常整洁的项目。我们刚开始使用它来将一些GWT堆栈移植到errai。

随着公共汽车(我猜是Errai最着名的部分),我有一个非常快的问题。我们还没有带来CDI ......在完成一些核心重构后,它会在某些时候完成。

这是Q:

对于我们的示例应用程序 - 我有一个客户端代码(下面的总线监听片段):

public void onModuleLoad(){

 bus = ErraiBus.get();

 initEBus();


 /.... then create the login panel with login button etc./

}

       private void initEBus() {
            // TODO Auto-generated method stub
           System.out.println("initbus");
            bus.subscribe("Login", new MessageCallback() {


                public void callback(CommandMessage message) {
                     /**
                      * When a message arrives, extract the "text" field and
                      * do something with it
                      */
                    System.out.println( message.get(String.class, "text"));
                    }

                @Override
                public void callback(Message message) {
                    // TODO Auto-generated method stub

                }           
            });
        }

在服务器端(按下登录按钮时通过RPC进行调用):

私人MessageBus msgBus = ErraiBus.get();

@Override

public Boolean doLogin(String username, String password) {


// TODO Auto-generated method stub


System.out.println("dispatching message");


msgBus.send(MessageBuilder


        .createMessage()


        .toSubject("Login")


        .with("text", "Hi There").done().getMessage());


return true;

}

当我运行它时,服务器似乎正在发送一条消息(我只能假设没有错误,并且该方法确实成功返回true),但客户端永远不会收到消息并且不会打印任何内容。

我假设我们正在做一些非常愚蠢或缺少某些事情......有谁能告诉我我们做错了什么?

非常感谢,

麦克,

1 个答案:

答案 0 :(得分:2)

我看到你可能想要看到的一些事情:

首先,您在此示例中混合了抽象级别。虽然编写一个在某些地方使用低级MessageBuilder和MessageCallback API的应用程序,在其他地方使用Errai RPC,在其他地方使用CDI事件和观察者,但我不建议混合和匹配这些抽象级别在同一个用例中(例如,使用MessageBuilder响应RPC调用)。

所以在上面的例子中,我建议您选择从Errai RPC方法返回一个值,并在客户端的RemoteCallback中接收该值:

@Inject Caller<MyRpcService> myRpcService;

public void doRpcCall() {
  myRpcService.call(new RemoteCallback<String>() {
    @Override public void callback(String response) {
      System.out.println("Got RPC response from server: " + response);
    }
  }).doLogin(username, password);
}

或者,如果您更喜欢直接使用低级总线API,请在服务器上执行以下操作:

@Service
public void doLogin(Message message) {

    // dig out message parts for username and password ...

    MessageBuilder.createConversation(message)
        .toSubject("Login")
        .with("text", "Hello, World!")
        .done().reply();
}

其次,在您的示例服务器端代码中,您发送的消息将是Login主题的广播消息。请注意,上面的代码仅向调用您的服务方法的一个客户端发送私人回复。从你的问题的背景来看,我认为这是你想要的行为。

PS:这个问题被交叉发布到Errai Community forum。我最初在那里发布了这个答案,为了方便他人,我在这里重新发布。