如何在 GlassFish 上从 JAX-WS 向 Swing 客户端构建推送通知?

Posted

技术标签:

【中文标题】如何在 GlassFish 上从 JAX-WS 向 Swing 客户端构建推送通知?【英文标题】:How to architect push notifications to a Swing client from JAX-WS on GlassFish? 【发布时间】:2012-11-28 10:08:35 【问题描述】:

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

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

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

我的问题是

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

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

我的想法:

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

【问题讨论】:

【参考方案1】:

模拟推送通知的一种方法是long polling。这 技术称为Comet or Reverse AJAX。虽然它更常见 在基于 REST 的服务中,它可以很容易地在 JAX-WS。

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

asynchronous web service invocation JAX-WS client APIs ... Using the JAX-WS asynchronous programming model

让客户端每 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);

【讨论】:

【参考方案2】:

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

如果您需要(几乎)实时通知,请查看 JMS(尤其是 topics)。 HornetQ 是其中一种实现,如果您使用的是 JBoss,则易于使用。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于如何在 GlassFish 上从 JAX-WS 向 Swing 客户端构建推送通知?的主要内容,如果未能解决你的问题,请参考以下文章

在Linux上从泽西返回Json引发异常

在服务器事件上从服务器向客户端发送通知

在 Linux 上从 Jersey 返回 Json 会引发异常

如何在不设置系统范围属性的情况下将 HTTP 代理用于 JAX-WS 请求?

在 Glassfish 上使用 JMS 向世界打招呼

如何在 Redshift 数据库上从 Python 触发更新 SQL