【问题标题】:Cometd filter data for specific client in channelCometd 过滤频道中特定客户端的数据
【发布时间】:2013-03-21 02:21:21
【问题描述】:

我正在使用 Comet 设计一个系统,其中有一个发布数据的公共通道。我需要根据客户端订阅详细信息使用某些条件过滤数据。谁能告诉我该怎么做?我想我可以使用 DataFilter 来做到这一点。

Channel.addDataFilter(DataFilter filter);

这是正确的方法吗?如果是这样,请提供任何示例代码来实现这一点?

【问题讨论】:

    标签: java comet cometd


    【解决方案1】:

    没有Channel.addDataFilter(DataFilter) 方法,但您可以通过不同的方式获得相同的结果。

    首先,看看可用的DataFilter 实现already available

    然后,您只需将DataFilterMessageListener 添加到要过滤数据的通道,并在DataFilterMessageListener 中指定一个或多个DataFilter

    您可以在 CometD 发行版随附的 CometD 演示中找到一个示例,例如 here

    添加DataFilterMessageListener 的正确方法是在通道初始化期间,正如在上面链接的示例中通过@Configure 注释或等效地通过ServerChannel.Initializer 完成的那样。

    最后,从文档中查看消息在服务器上的处理方式:http://docs.cometd.org/reference/#concepts_message_processing。 请务必了解,DataFilter 所做的修改会被所有订阅者看到。

    【讨论】:

    • 谢谢。将按照您建议的方式进行尝试并给出我的反馈。
    • 我检查了链接。我发现可以使用它们对数据进行通用过滤。但是如果不需要发送到某个特定的客户端,我需要停止在同一通道中发送数据。只是我需要停止为某些客户端发送数据并为其他一些客户端启用。对此有什么帮助吗?再次感谢您的链接。
    • @Suda 如果您需要向同一频道的不同订阅者发送不同的数据,那么您不能使用侦听器或 API,例如 ServerChannel.publish(...),因为它们会向所有订阅者发送相同的消息。您需要改用ServerSession.deliver(...),从频道的订阅者那里获取ServerSession 的列表。由于您正在遍历订阅者,因此您可以通过手动应用 DataFilter 来应用/修改每个 ServerSession 的消息。最后,如果您从MessageListener 返回false,则消息处理将中止。
    • 谢谢@sbordet。我会按照你建议的方式进行。
    • @Bordet,我能够成功实现这一点。但是与发布方式相比,这样做有什么性能差异吗?简单地问,以下哪一项性能更好?使用 publish() 方法发送给所有订阅的客户端或迭代客户端并使用传递方法发送?谢谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多