Blazeds messaging filter

来源:互联网 发布:淘宝买药怎么取消订单 编辑:程序博客网 时间:2024/05/22 05:15
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>


原创粉丝点击