加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Blazeds messaging filter

发布时间:2020-12-15 01:09:45 所属栏目:百科 来源:网络整理
导读:Blazeds messaging service支持message filter,即过滤消息。例如,各个group都是用同一个blazeds message destination来发送消息,我只希望收到我所在的group的member发送的消息,这就要用到message filter。 Blazeds messaging service提供了2种message fi
Blazeds messaging service支持message filter,即过滤消息。例如,各个group都是用同一个blazeds message destination来发送消息,我只希望收到我所在的group的member发送的消息,这就要用到message filter。

Blazeds messaging service提供了2种message filter的方式:

1. add subtopic information。flex "producer" component在call "send" method之前,要设置"producer"的subtopic的值。另一方面,flex "consumer"component需要设置"subtopic" property来定义需要接收属于哪个sub topic的message。该方式最适合分group的message


2. flex "producer" component在call "send" method之前, add information to message headers。另一方面,flex "consumer"component需要设置"selector" property来定义需要接收的message的criteria (例如selector="prop1 > 4" 表示只接收在message header里的'prop1' value大于4的message)。该方法提供更灵活和强大的message filter criteria。

注意:上面2种方式选其中一种来用,不能同时使用2种。


Use subtopic for message filter

flex "Producer" component可以设置要发送的消息的category,"Consumer" component可以设置只接收某种category的message。


注意:若你的blazeds message destintion是JMS,则不能使用subtopic方式,而应该后面介绍的Selector方式。


在Producer component里,设置它的subtopic property来定义该producer发送的消息的category。该值的format是:

??????? mainToken[.secondaryToken][.additionalToken][...]

token之间用"."里间隔。(如果你想使用其他符号来间隔,那么就要修改该destination在"messaging-config.xml" file里<subtopic-separator> property的设置,by default是使用"."来间隔)

例,你可以定义subtopic为"chat" or "chat.fds" or "chat.fds.newton".


在Consumer component里,设置它的subtopic property来定义应该接收哪些category的消息。该值的format和上面producer的subtopic一样,唯一不同的是,comsumer的subtopic可以使用wildcard character "*"

例1:如果设置comsumer的subtopic="foo.*",那么它可以接收category为"foo.bar" and "foo.baz" and "foo.bar.aaa" and "foo.bar.bbb.ccc"的message。


例2:如果“*”放在中间,subtopic="foo.*.baz",那么它可以接收category为"foo.bar.baz" and "foo.aaa.baz",但不接收 "foo.bar.cookie" message。


下面是使用subtopic technology的flex code example (send "chat.fds.newton" category message,receive "chat.fds.*" category message)

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.messaging.*;
import mx.messaging.messages.*;
import mx.messaging.events.*;

private function useSubtopic():void {
?? ?var message:AsyncMessage = new AsyncMessage();
?? ?producer.subtopic = "chat.fds.newton";
?? ?producer.send(message);
}

private function messageHandler(event:MessageEvent):void {
?? ?ta.text += event.message.body + "n";
}

private function logon():void {
?? ?consumer.subtopic = "chat.fds.*";
?? ?consumer.subscribe();
}

]]>
</mx:Script>

<mx:Producer id="producer" destination="chat"/>
<mx:Consumer id="consumer" destination="chat" message="messageHandler(event);"/>
<mx:TextArea id="ta" width="100%" height="100%"/>
</mx:Application>

还有一步要做:在WEB-INF/flex/messaging-config.xml里设置你的message destination support subtopic。

<destination id="ChatTopic">
?? ?<properties>
?? ??? ?<network>
?? ??? ??? ?<subscription-timeout-minutes>0</subscription-timeout-minutes>
?? ??? ?</network>
?? ??? ?<server>
?? ??? ??? ?<message-time-to-live>0</message-time-to-live>
?? ??? ??? ?<allow-subtopics>true</allow-subtopics>
?? ??? ??? ?<subtopic-separator>.</subtopic-separator>

?? ??? ?</server>
?? ?</properties>
?? ?<channels>
?? ??? ?<channel ref="my-streaming-amf"/>
?? ?</channels>
</destination>


Use selector for message filter


基本原理是:

一方面,flex "producer" component在call "send" method之前, 使用add extra information to message headers。

另一方面,flex "consumer"component需要设置"selector" property来定义需要接收的message的criteria。


例子:发送附加信息"prop1"的值为5的message,接收附加信息"prop1“的值大于4的message。

<?xml version="1.0"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init();">>
?? ?<mx:Script>
?? ??? ?<![CDATA[
?? ??? ??? ?import mx.messaging.*;
?? ??? ??? ?import mx.messaging.messages.*;
?? ??? ??? ?import mx.messaging.events.*;

?? ??? ??? ?private function init():void {
?? ??? ??? ??? ?consumer.subscribe();
?? ??? ??? ?}
?? ??? ??? ?private function sendMessage():void {
?? ??? ??? ??? ?var message:AsyncMessage = new AsyncMessage();
?? ??? ??? ??? ?message.headers = new Array();
?? ??? ??? ??? ?//Use the AsyncMessage.headers property of the message to specify the message headers.
?? ??? ??? ??? ?//message header是一个array,你可以添加多个key-value pair
?? ??? ??? ??? ?//Note: header里的element key不能以"JMS" or "DS"作为前缀!!
?? ??? ??? ??? ?//注意:headers里的element的值只能是number or String!!!
?? ??? ??? ??? ?//在该例里,不能设置其值为string,如 message.headers["prop1"] = "5";
?? ??? ??? ??? ?//这是因为在后面consumer component里设置selector="prop1 > 4",使用的是number,而不是string
?? ??? ??? ??? ?//若要selector使用string,应该为selector="prop1 = '5'" (没试过,我猜的)
?? ??? ??? ??? ?message.headers["prop1"] = 5;
?? ??? ??? ??? ?message.body = input.text;
?? ??? ??? ??? ?producer.send(message);
?? ??? ??? ?}

?? ??? ??? ?private function messageHandler(event:MessageEvent):void {
?? ??? ??? ??? ?ta.text += event.message.body + "n";
?? ??? ??? ?}
?? ??? ?]]>
?? ?</mx:Script>

?? ?<mx:Producer id="producer" destination="chat"/>
?? ?<!-- selector属性值是一个SQL conditional expression-->
?? ?<mx:Consumer id="consumer" destination="chat" selector="prop1 > 4" message="messageHandler(event);"/> ?? ?<mx:TextArea id="ta" width="100%" height="100%"/> </mx:Application>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读