2013-05-30 5 views
1

Errai выглядит как действительно опрятный проект. Мы только начали работать с ним, чтобы перенести часть стека GWT на errai.Errai Bus (Newbie) - без CDI - Quick Q

С автобусом (я думаю, самая известная часть Errai), у меня был очень быстрый Q. Мы все еще havent привезли CDI .. сделаем в какой-то момент после того, как будет выполнен основной рефакторинг.

Здесь идет Q:

Для нашего образца приложения - У меня есть на стороне клиента код (автобус 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):

частный 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; 

} 

Когда я запускаю это, сервер, кажется, посылает сообщение (я могу только предположить, так как нет никаких ошибок и метод не возвращает истину успешно), но клиент никогда не получает сообщение и оленья кожа печати ничего ,

Я предполагаю, что мы делаем что-то крайне глупо или что-то не хватает ... Может ли кто-нибудь сказать мне, что мы делаем неправильно?

Спасибо большое,

Майк,

ответ

2

Я вижу несколько вещей, которые вы можете захотеть взглянуть на:

Во-первых, вы смешиваете уровни абстракции в этом примере. Хотя вполне нормально писать приложение, которое использует в некоторых местах низкоуровневый MessageBuilder и MessageCallback API, Errai RPC в других местах, а также события CDI и наблюдатели в других местах, я не могу рекомендовать смешивать и сопоставлять эти уровни абстракции в одном и том же варианте использования (например, ответ на вызов RPC с использованием MessageBuilder).

Таким образом, в случае, выше, я рекомендую вам выбрать либо вернуть значение из метода 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. Я изначально разместил там этот ответ, и я переписываю его здесь для удобства других.

Смежные вопросы