1

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

使用 Bus(我猜是 Errai 中最著名的部分),我有一个非常快速的 Q。我们还没有引入 CDI。在完成一些核心重构之后,会在某个时候做。

这是Q:

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

公共无效 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),但客户端永远不会收到消息并且不打印任何内容。

我假设我们正在做一些非常愚蠢的事情或遗漏了一些事情......谁能告诉我我们做错了什么?

非常感谢,

麦克风,

4

1 回答 1

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();
}

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

PS:这个问题被交叉发布到Errai 社区论坛。我最初在此处发布了此答案,为了方便其他人,我将其重新发布在这里。

于 2013-06-10T18:17:12.737 回答