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),但客户端永远不会收到消息并且不会打印任何内容。
我假设我们正在做一些非常愚蠢或缺少某些事情......有谁能告诉我我们做错了什么?
非常感谢,
麦克,
答案 0 :(得分: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主题的广播消息。请注意,上面的代码仅向调用您的服务方法的一个客户端发送私人回复。从你的问题的背景来看,我认为这是你想要的行为。
PS:这个问题被交叉发布到Errai Community forum。我最初在那里发布了这个答案,为了方便他人,我在这里重新发布。