Данные фильтра Cometd для конкретного клиента в канале

Я разрабатываю систему с использованием кометы, где есть общий канал, по которому публикуются данные. Мне нужно отфильтровать данные, используя некоторые условия на основе сведений о клиентской подписке. Может ли кто-нибудь сказать, как я могу это сделать? Я думал, что могу сделать это с помощью DataFilter.

Channel.addDataFilter(DataFilter filter);

Это правильный путь? Если да, то какой-нибудь пример кода для этого, пожалуйста?


person Sudarsan    schedule 30.03.2013    source источник


Ответы (1)


Метода Channel.addDataFilter(DataFilter) не существует, но вы можете добиться тех же результатов другим способом.

Во-первых, взгляните на доступные DataFilter реализации уже доступен.

Тогда достаточно добавить DataFilterMessageListener к каналу, по которому вы хотите отфильтровать данные, и указать один или несколько DataFilter к DataFilterMessageListener.

Вы можете найти пример этого в демонстрациях CometD, поставляемых с дистрибутивом CometD, например, здесь.

Правильный способ добавить DataFilterMessageListener — во время инициализации канала, как это делается в примере, указанном выше, с помощью аннотации @Configure или, что то же самое, с помощью ServerChannel.Initializer.

Наконец, посмотрите, как сообщения обрабатываются на сервере, из документации: http://docs.cometd.org/reference/#concepts_message_processing. Важно понимать, что изменения, сделанные DataFilter, видят все подписчики.

person sbordet    schedule 30.03.2013
comment
Спасибо. Попробую так, как вы посоветовали, и дам свой отзыв. - person Sudarsan; 31.03.2013
comment
Я проверил ссылки. Я обнаружил, что с их помощью можно выполнять фильтрацию данных. Но мне нужно перестать отправлять данные в тот же канал, если нет необходимости отправлять какому-то конкретному клиенту. Просто мне нужно остановить отправку данных для некоторых клиентов и включить для некоторых других. Любая помощь в этом? Спасибо за ссылки еще раз. - person Sudarsan; 31.03.2013
comment
@Suda, если вам нужно по-разному отправлять данные разным подписчикам на один и тот же канал, вы не можете использовать прослушиватели или API, такие как ServerChannel.publish(...), потому что они будут отправлять одно и то же сообщение всем подписчикам. Вместо этого вам нужно использовать ServerSession.deliver(...), взяв список ServerSession от подписчиков канала. Поскольку вы перебираете подписчиков, вы можете применять/изменять свои сообщения для каждого ServerSession, применяя DataFilter вручную. Наконец, если вы вернете false из MessageListener, обработка сообщения будет прервана. - person sbordet; 02.04.2013
comment
Спасибо @sbordet. Я буду следовать тому пути, который вы предложили. - person Sudarsan; 03.04.2013
comment
@Bordet, мне удалось это успешно реализовать. Но есть ли разница в производительности по сравнению с методом публикации? Просто спросите, что из следующего имеет лучшую производительность? Отправка всем подписанным клиентам с использованием метода publish () ИЛИ повторение клиентов и отправка с использованием метода доставки? Спасибо за совет. - person Sudarsan; 08.04.2013
comment
@Bordet, звучит здорово! Я беспокоился, не потеряю ли я некоторую производительность, выполняя итерации вручную для фильтрации. Спасибо за вашу помощь! очень признателен :) - person Sudarsan; 09.04.2013