【发布时间】:2013-03-21 02:21:21
【问题描述】:
我正在使用 Comet 设计一个系统,其中有一个发布数据的公共通道。我需要根据客户端订阅详细信息使用某些条件过滤数据。谁能告诉我该怎么做?我想我可以使用 DataFilter 来做到这一点。
Channel.addDataFilter(DataFilter filter);
这是正确的方法吗?如果是这样,请提供任何示例代码来实现这一点?
【问题讨论】:
我正在使用 Comet 设计一个系统,其中有一个发布数据的公共通道。我需要根据客户端订阅详细信息使用某些条件过滤数据。谁能告诉我该怎么做?我想我可以使用 DataFilter 来做到这一点。
Channel.addDataFilter(DataFilter filter);
这是正确的方法吗?如果是这样,请提供任何示例代码来实现这一点?
【问题讨论】:
没有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 所做的修改会被所有订阅者看到。
【讨论】:
ServerChannel.publish(...),因为它们会向所有订阅者发送相同的消息。您需要改用ServerSession.deliver(...),从频道的订阅者那里获取ServerSession 的列表。由于您正在遍历订阅者,因此您可以通过手动应用 DataFilter 来应用/修改每个 ServerSession 的消息。最后,如果您从MessageListener 返回false,则消息处理将中止。