2013-03-30 6 views
1

데이터를 게시하는 공통 채널이있는 곳에서 혜성을 사용하여 시스템을 설계하고 있습니다. 클라이언트 가입 세부 정보를 기반으로 일부 조건을 사용하여 데이터를 필터링해야합니다. 아무도 내가 이것을 할 수있는 방법을 말할 수 있습니까? DataFilter를 사용하여이 작업을 수행 할 수 있다고 생각했습니다.채널의 특정 클라이언트에 대한 Cometd 필터 데이터

Channel.addDataFilter(DataFilter filter); 

올바른 방법입니까? 만약 그렇다면 어떤 샘플 코드라도이 기능을 수행 할 수 있습니까?

답변

2

Channel.addDataFilter(DataFilter) 방법은 없지만 동일한 결과를 다른 방식으로 얻을 수 있습니다.

먼저 DataFilter 구현 already available을 살펴보십시오.

그런 다음 당신은 당신이 데이터를 필터링 할 채널에 DataFilterMessageListener을 추가하고, DataFilterMessageListener 하나 이상의 DataFilter을 지정하는 것이 충분하다.

이 예는 CometD 배포와 함께 제공되는 CometD 데모에서 찾을 수 있습니다 (예 : here). 그것은, 또는 동일 ServerChannel.Initializer 통해 @Configure 주석 링크를 통해 상기 실시 예에서 수행 된 바와 같이

DataFilterMessageListener를 추가하는 적당한 방법은, 채널 초기화 동안이다.

마지막으로 문서에서 서버의 메시지 처리 방법을 확인하십시오 (http://docs.cometd.org/reference/#concepts_message_processing). DataFilter의 수정 사항은 모든 가입자가 볼 수 있음을 이해하는 것이 중요합니다.

+0

감사합니다. 당신이 조언하고 내 의견을 제공하는 방식으로 밖으로 시도합니다. – Sudarsan

+0

링크를 확인했습니다. 나는 그들을 사용하여 공통적 인 데이터에서 필터링을 할 수 있다는 것을 발견했다. 그러나 특정 클라이언트에 보낼 필요가없는 경우 같은 채널에서 데이터 전송을 중단해야합니다. 간단히 말해 일부 클라이언트의 경우 데이터 전송을 중단하고 다른 클라이언트의 경우 데이터 전송을 중지해야합니다. 이것에 대한 도움이 필요하십니까? 다시 한번 링크에 감사드립니다. – Sudarsan

+1

@Suda 서로 다른 가입자에게 동일한 채널로 데이터를 다르게 보내야하는 경우 'ServerChannel.publish (...)'와 같은 API를 사용할 수 없으므로 모든 가입자에게 동일한 메시지가 전송됩니다. 대신에'ServerSession.deliver (...)'를 써야하며, 채널의 서브 크라이 머에서'ServerSession'의 목록을 가져와야합니다. 구독자를 반복하는 중이므로 'DataFilter'를 수동으로 적용하여 각 'ServerSession'에 대한 메시지를 적용/수정할 수 있습니다. 마지막으로'MessageListener'에서'false'를 반환하면 메시지 처리가 중단됩니다. – sbordet