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

Qui*_*nma 5 java notifications swing web-services

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

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

我创建了一个超级用户Web门户,用于输入String数据并将其保存到数据库中.

我的问题是:

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

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

我的想法:

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

Dan*_*Dan 6

模拟推送通知的一种方法是长轮询.这种技术称为Comet或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);
Run Code Online (Sandbox Code Playgroud)