【问题标题】:Errai Bus (Newbie) - Without CDI - Quick QErrai Bus(新手)- 不带 CDI - Quick Q
【发布时间】:2013-05-30 22:40:52
【问题描述】:

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

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

这里是问:

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

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

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

非常感谢,

迈克,

【问题讨论】:

    标签: errai


    【解决方案1】:

    我看到了一些你可能想看的东西:

    首先,您在此示例中混合了抽象级别。虽然在某些地方编写一个使用低级 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 Community forum。我最初在此处发布了此答案,为了方便其他人,我将其重新发布在这里。

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      相关资源
      最近更新 更多