2013-05-30 20 views
1

Errai看起來是一個非常整潔的項目。我們剛開始使用它來將一些GWT棧移植到errai。Errai巴士(新手) - 沒有CDI - Quick Q

隨着巴士(我猜Errai中最有名的部分),我有一個非常快速的問題。我們還沒有帶入CDI ..在某些核心重構完成後會做某些事情。

這裏去的問:

對於我們的示例應用程序 - 我有一個客戶端代碼(以下總線listenining片段):

公共無效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發生sed):

private 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成功),但客戶端從未收到消息和犯規打印任何東西。

我假設我們正在做的事情非常愚蠢的或缺少的東西....誰能告訴我,我們在做什麼錯?

謝謝了,

麥克,

回答

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 Community forum。我原本在這裏發佈了這個答案,爲了方便其他人,我在這裏重新發布它。