在不淹没客户端的情况下推送更新事件。干净的方式来做到这一点?

Posted

技术标签:

【中文标题】在不淹没客户端的情况下推送更新事件。干净的方式来做到这一点?【英文标题】:Pushing update events without flooding the client. Clean way to do this? 【发布时间】:2012-04-03 16:05:58 【问题描述】:

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

我有一个表格来跟踪多个事物的状态。服务器可以随意将更改推送给客户端。

问题是我不想推送更新,如果最后一次更新不到 5 秒前。

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

我现在的刺是这样的:

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

它在大多数情况下都足够好用,但显然最后一次更新可以不推送。

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

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

谢谢,

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于在不淹没客户端的情况下推送更新事件。干净的方式来做到这一点?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在不创建新套接字的情况下处理 CRL 更新

在不安装oracle客户端的情况下,使用PLSQL

Java WebSocket:如何在不编写客户端的情况下测试服务器 WebSocket 端点 [关闭]

AJAX

我们能否在不损害其他客户数据的情况下为不同客户使用单个 Azure 事件中心?

在不使用 GCM 的情况下在 android 中推送通知