gwt服务器向所有打开的应用发送通知

时间:2013-07-26 10:19:43

标签: gwt

在我的应用程序中,我需要这样的功能:使用我工作的gwt应用程序登录的特权用户按下按钮,请求转到服务器和服务器向所有其他登录用户发送通知,然后他们的应用程序显示某种警报。我无法弄清楚的一步是向所有登录用户发送通知 - 如何建立某种clien-server连接,直到特权用户触发通知为止,以及服务器如何收集有关所有登录用户的信息?你能提出任何建议吗?

4 个答案:

答案 0 :(得分:1)

如果您使用GWT-RPC,一种方法是“长时间通话”。

您的客户拨打GWT-RPX电话,服务器端无所事事。最终,您的特权用户点击按钮,服务器端发出所有“等待”客户端的信号 - 他们的长RPC调用返回并执行某些操作。

您可能会发现需要将它包装在一个类中:长调用可能会超时,具体取决于服务器配置,因此您确实需要一个在服务器端等待x秒的循环,然后返回一个告诉的代码触发器未发生的客户端,因此应再次进行调用。

这个功能可能已经由一些第三方库提供了,但是我把它推了一会儿又有效了; - )

从服务器端的内存中我有所有客户端调用等待信号量,当特权用户服务器端调用时必须确保它发布了正确的号码(以便所有等待的客户端都发出信号继续) 只需一个同步变量和一个循环,你就可以做一些更简单的事情。

客户端 - 考虑这个伪代码,它并没有真正考虑到这一点。

// 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块。您还需要在某处将锁重置为false。

答案 1 :(得分:1)

您可以将Errai-Bus用于此目的 例如,我已经实现了推送通知。每当用户将对象的权限授予另一个用户时,将通知用户。

有两个工作流程:

1。)订阅广播信息:

每当用户登录时,您的GWT应用程序都会在MessageBus(Errai)上订阅特定的邮件主题(即广播)。
当特定用户按下按钮时,您会通过MessageBus向服务器发送消息。服务器接收它并创建广播消息并将其发送给所有登录的客户端订阅的相应主题(即广播)。

2.)订阅个人用户:

或者,只要用户登录您,您的GWT应用就会创建一个Message,其中包含某种用户的唯一ID,并通过Message将此MessageBus发送到服务器。在服务器上,您收到Message并将唯一用户ID存储在数据结构中(即Map)。 除了客户端之外,您的GWT应用程序还订阅主题等于其所有者用户ID(之前发送给服务器)的邮件。
这样您就可以发送给个人用户。

您还可以组合两个工作流程并让GWT应用程序同时订阅广播消息和用户消息。

答案 2 :(得分:0)

如何在客户端使用Timer来轮询服务器以进行更改。只需将您的通知存储在数据库中,并让客户每隔几秒检查一次新通知。您不需要锁定服务器上的某些内容,因此也可以使用多个服务器。无需跟踪谁登录。活动客户端轮询新通知,如果客户端消失,则只停止轮询。

答案 3 :(得分:0)

要让服务器与客户联系,您必须实施WebSockets之类的功能。

Here's one sockets library that supports GWT。 或者你可以看到this search带你到哪里。