推送更新事件而不会使客户端泛滥。干净的方式来做到这一点?

时间:2012-04-03 16:05:58

标签: java events event-handling pushviewcontroller server-push

我认为这是一个已经解决的问题,但我的google-fu还不够好。

我有一张表跟踪多件事情的状态。服务器可以随意将更改推送到客户端。

问题是我不想在最后一次更新少于5秒之前推送更新。

在不创建另一个事件管理器线程的情况下实现此目的的最简洁方法是什么?

我目前的刺伤看起来像这样:

pushEvent(){
    Look up the last update time
    if: last update less than 5 sec ago
        then do nothing
    else
        pushToClients
}

在大多数情况下,它的效果非常好,但显然最后一次更新可能会被取消。

这样做的好方法是什么? 我想到的一些方法:

  1. 为所有推送添加5秒延迟(例如Thread.sleep),这样我就可以 检查是否已安排更新。不理想,但没有人 可能会介意。
  2. 执行推送,然后设置doNotPush = true。使用计时器 把它设置回假。
  3. 谢谢,

1 个答案:

答案 0 :(得分:0)

在服务器上,您可以使用包含HashMap对作为值的{current event, last sent event}和将事件的接收者(客户端)作为键。然后使用计划的周期性任务,迭代这个地图,检查是否current event != last sent event,如果是,则将当前事件发送给客户端(并将其放入last sent)。

一个缺点可能是,如果发送到客户端的速度很慢,则传出队列中可能存在阻塞事件。您可以通过异步发送来解决此问题(例如,通过卸载要发送到单独的Executor中的事件)。