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

时间:2012-12-10 22:28:22

标签: java web-services swing notifications

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

我希望能够向所有保持活动状态的用户分发字符串通知,直到他们读完为止。通知只需要存在于Swing客户端中。

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

我的问题是

  1. 将此数据字符串通知分发给我的客户的最佳技术是什么?
  2. 我应该如何构建数据库以了解是否已查看通知? (所以我可以停止在客户端上显示“新通知”)
  3. 或者,如果引用的指南非常有效,我找不到。

    我的想法:

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

3 个答案:

答案 0 :(得分:6)

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

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

  

让客户每隔10分钟拨打一次网络服务,检查是否有新通知

使用长轮询,您可以建立初始客户端连接 马上。但不是服务器立即响应,而是挂起 连接(异步)。然后当通知需要时 被推,它回应现有的连接。

使用这种技术,只要信息可用 服务器,它将被“推送”到客户端。

  

为数据库创建通知表和通知。将我的用户表链接到通知看表。看到的通知非常基本,只有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);

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

我建议使用Message Queue服务器。就像有人建议使用HornetQ或ActiveMQ,如果你愿意,你可以将它嵌入你的服务器。