模拟推送通知的一种方法是长轮询。这种技术称为Comet 或 Reverse AJAX。虽然它在基于 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);