1

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 を返すと仮定できます) が、クライアントはメッセージを取得せず、何も出力しません。

私たちは非常にばかげたことをしている、または何かが欠けていると思います....誰か私たちが間違っていることを教えてもらえますか?

どうもありがとう、

マイク、

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

次に、サンプルのサーバー側コードでは、送信するメッセージは Login トピックへのブロードキャスト メッセージになります。上記のコードは、サービス メソッドを呼び出した 1 つのクライアントだけに非公開の応答を送信することに注意してください。あなたの質問の文脈から、これはあなたが意図していた行動だと思います。

PS: この質問は、 Errai コミュニティ フォーラムにクロス投稿されました。私はもともとこの回答をそこに投稿しましたが、他の人の便宜のためにここに再投稿しています。

于 2013-06-10T18:17:12.737 に答える