5

我有一个广泛分布的 java swing 应用程序,它是来自 Glassfish 3.1.2 服务器上的 JAX WebService EJB 的 Web 服务客户端。

我希望能够向所有在阅读之前保持活动状态的用户分发字符串通知。通知只需要存在于 Swing 客户端中。

我创建了一个超级用户门户网站来输入字符串数据并将其保存到数据库中。

我的问题是

  1. 向我的客户(推送)分发此数据字符串通知的最佳技术是什么?
  2. 我应该如何构建数据库以了解通知是否已被查看?(所以我可以停止在客户端显示“新通知”)

或者,如果有参考可以很好地工作的指南,我找不到。

我的想法:

  • 让客户端每 10 分钟调用一次 Web 服务以检查是否有任何新通知
  • 为数据库创建通知表和看到的通知。将我的用户表链接到通知表。看到的通知非常基本,只有 3 列:NotificationID、UserID、TimeSeen。
4

3 回答 3

6

模拟推送通知的一种方法是长轮询。这种技术称为Comet 或 Reverse AJAX。虽然它在基于 REST 的服务中更为常见,但在 JAX-WS 中也可以轻松完成。

对于 JAX-WS,您需要调查:

让客户端每 10 分钟调用一次 Web 服务以检查是否有任何新通知

与长轮询不同,您可以立即建立初始客户端连接。但不是服务器立即响应,而是挂在连接上(异步)。然后,当需要推送通知时,它会在现有连接上做出响应。

使用这种技术,一旦服务器上的信息可用,它就会被“推送”到客户端。

为数据库创建通知表和看到的通知。将我的用户表链接到通知表。看到的通知非常基本,只有 3 列:NotificationID、UserID、TimeSeen。

听起来不错。将其公开为 JAX-WS 服务。当客户端收到消息时,让他们使用 NotificationID 调用它。

就像是:

NotificationService svc = ...;
UserId userId = ...;

AsyncHandler<Notification> handler = new AsyncHandler<Notification>()
{
    public void handleResponse (Response<Notification> response)
    {
       Notification notification = response.get();

       // update swing gui

       NotificationID notificationId = notifcation.getId();

       svc.markNotificationAsSeen(userId, notificationId);

       // continue polling forever (or put in some logic to stop)
       svc.getNotificationAsync(userId, this);
    }
};

Future<?> invocation = svc.getNotificationAsync(userId, handler);
于 2012-12-10T23:47:59.117 回答
3

如果 10 分钟通常足够了,并且您确定您的用户可以等待那么久,请坚持每 10 分钟轮询一次服务器。

如果您需要(几乎)实时通知,请查看 JMS(尤其是主题)。HornetQ是其中一种实现,如果您使用 JBoss,它很容易使用。

于 2012-12-10T22:35:46.987 回答
2

我建议使用消息队列服务器。就像有人建议的 HornetQ 或 ActiveMQ 一样,如果您愿意,可以将它们嵌入到您的服务器上。

于 2012-12-10T22:52:59.843 回答