在我的应用程序中,我需要这样的功能:使用我工作的 gwt 应用程序登录的特权用户按下按钮,请求转到服务器,服务器向所有其他登录用户发送通知,然后他们的应用程序显示某种警报。我无法弄清楚的一个步骤是向所有登录用户发送通知 - 如何建立某种客户端服务器连接,直到特权用户触发通知以及服务器如何收集有关所有登录用户的信息?你能就如何处理它提出任何建议吗?
4 回答
如果您使用 GWT-RPC,一种方法是“长调用”。
您的客户拨打 GWT-RPX 电话,而服务器端坐在那里无所事事。最终,您的特权用户点击按钮,服务器端向所有“等待”客户端发出信号——他们的长 RPC 调用返回并且他们做一些事情。
您可能会发现需要将其包装在一个类中:长时间调用可能会超时,具体取决于服务器配置,因此您确实需要一个循环在服务器端等待 x 秒,然后返回一个告诉客户端的代码触发器没有发生,所以应该再次调用。
此功能可能已由某些 3rd 方库提供,但我不久前手动滚动它并且它可以工作;-)
从服务器端的内存中,我让所有客户端调用都在一个信号量上等待,而当特权用户服务器端调用只需要确保它释放正确的数字时(这样所有等待的客户端都会收到继续的信号)你可以做只需要一个同步变量和一个循环就更简单了。
客户端 - 考虑一下这个伪代码,它并没有真正考虑得那么好。
// lock needs to be a common var so all threads are working on the same one.
// probably a static?
int counter = 0;
while(counter < 5) {
synchronized(lock) {
if (lock) {
// return "success"
}
counter++;
sleep(1000); // sleep one second
}
}
// return "try again"
服务器大小显然需要同步调用设置lock
为 true,以便所有客户端都可以访问该return success
块。您还需要在某处将锁定重置为假。
您可以为此目的使用Errai-Bus。
例如,我实现了推送通知。每当用户将某个对象的权限授予另一个用户时,都会通知该用户。
有两个工作流程:
1.) 订阅广播消息:
MessageBus
每当用户登录时,您的 GWT 应用程序都会订阅(Errai)上的特定消息主题(即广播)。
当特定用户按下按钮时,您会通过MessageBus
向服务器发送消息。服务器接收它并创建一个广播消息并将它与所有登录的客户端订阅的相应主题一起发送(即广播)。
2.) 订阅个人用户:
或者,每当用户登录您时,您的 GWT 应用程序都会创建一个Message
包含用户的某种唯一 id 并Message
通过MessageBus
. 在服务器上,您收到Message
并将唯一用户 ID 存储在数据结构(即Map
)中。除了在客户端,您的 GWT 应用程序还订阅主题等于其所有者用户 ID(您之前发送到服务器)的消息。
这样您就可以发送给个人用户。
您还可以结合这两个工作流并让 GWT 应用程序订阅广播消息和用户消息。
如何在客户端使用计时器来轮询服务器以进行更改。只需将您的通知存储在数据库中,让客户每隔几秒钟检查一次新通知。您不需要锁定服务器上的某些内容,因此也可以与多个服务器一起使用。无需跟踪谁被记录。活跃的客户端轮询新的通知,如果客户端离开它就停止轮询。
为了让服务器与客户端联系,您必须实现WebSockets 之类的东西。
这是一个支持 GWT 的套接字库。或者您可以查看此搜索会将您带到哪里。