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

Java 如何在GlassFish上构建从JAX-WS到Swing客户端的通知?,java,web-services,swing,notifications,Java,Web Services,Swing,Notifications,我有一个广泛分布的JavaSwing应用程序,它是Glassfish 3.1.2服务器上JAX WebService EJB的web服务客户端 我希望能够将字符串通知分发给所有用户,这些用户在阅读该通知之前保持活动状态。通知只需要存在于Swing客户端中 我创建了一个超级用户web门户,用于输入字符串数据并将其保存到数据库中 我的问题是: 向我的客户(推送)分发此数据字符串通知的最佳技术是什么 我应该如何访问数据库以了解通知是否已被查看?(这样我就可以停止在客户端上显示“新通知”) 或者,如果有

我有一个广泛分布的JavaSwing应用程序,它是Glassfish 3.1.2服务器上JAX WebService EJB的web服务客户端

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

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

我的问题是:

  • 向我的客户(推送)分发此数据字符串通知的最佳技术是什么
  • 我应该如何访问数据库以了解通知是否已被查看?(这样我就可以停止在客户端上显示“新通知”)
  • 或者,如果有一个参考指南,它会非常有效,我也找不到

    我的想法是:

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

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


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

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

    模拟推送通知的一种方法是。这 这项技术被称为。虽然这更常见 在基于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);
    
    NotificationService svc=。。。;
    UserId UserId=。。。;
    AsyncHandler=新的AsyncHandler()
    {
    公共无效处理响应(响应)
    {
    Notification Notification=response.get();
    //更新swing gui
    NotificationID NotificationID=notification.getId();
    markNotificationAsSeen(userId,notificationId);
    //永远继续轮询(或输入一些逻辑停止)
    getNotificationAsync(userId,this);
    }
    };
    Future invocation=svc.getNotificationAsync(userId,handler);