我有一个广泛分布的java swing应用程序,它是来自Glassfish 3.1.2服务器上的JAX WebService EJB的Web服务客户端。
我希望能够向所有保持活动状态的用户分发字符串通知,直到他们读完为止。通知只需要存在于Swing客户端中。
我创建了一个超级用户门户网站,用于输入字符串数据并将其保存到数据库中。
我的问题是:
或者,如果引用的指南非常有效,我找不到。
我的想法:
答案 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,如果你愿意,你可以将它嵌入你的服务器。