Flex 4.1 + BlazeDS(Demo实例)实现信息订阅推送

来源:互联网 发布:微信淘宝优惠券可靠吗 编辑:程序博客网 时间:2024/06/05 05:34

Flex数据推送实现前台消息订阅,是在前面Flex 4.1 + BlazeDS(Demo小实例)整合基础上进行的。首先来看subscrible.mxml源代码,如下:

<?xml version="1.0" encoding="utf-8"?><s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"   xmlns:s="library://ns.adobe.com/flex/spark"   xmlns:mx="library://ns.adobe.com/flex/mx"   minWidth="955" minHeight="600"><s:layout><s:BasicLayout/></s:layout><fx:Script><![CDATA[import mx.controls.Alert;import mx.messaging.ChannelSet;import mx.messaging.Consumer;import mx.messaging.events.MessageEvent;protected function submsg():void{Alert.show("click start"); var consumer:Consumer = new Consumer(); consumer.destination = "tick-data-feed"; consumer.subtopic = "tick"; consumer.channelSet = new ChannelSet(["my-streaming-amf"]);//添加message的监听,当后台有消息发送时,调用messageHandler consumer.addEventListener(MessageEvent.MESSAGE, messageHandler); consumer.subscribe(); } private function messageHandler(event:MessageEvent):void { var tick:TickVO =  event.message.body as TickVO; txtTick.text = tick.messageCN + tick.seqNo; } ]]></fx:Script><fx:Declarations></fx:Declarations><mx:Panel x="32" y="43" width="362" height="302" layout="absolute" title="Watch Tick"><mx:Label id="txtTick" x="72" y="43" text="Label"/><mx:Button x="132" y="71" label="Button" click="submsg()"/></mx:Panel></s:Application>
然后编写TickVo.as文件,如下:

package{//远程到后台的Tick,也就是说他们俩现在是对应的关系了,你在后台给model赋值了,在前台flex中就可以通过VO//取得model中的值[RemoteClass(alias="com.model.Tick")] [Bindable] public class TickVO{private var _seqNo:String;private var _messageCN:String;public function TickVO(){}public function get seqNo():String{return _seqNo;}public function set seqNo(value:String):void{_seqNo = value;}public function get messageCN():String{return _messageCN;}public function set messageCN(value:String):void{_messageCN = value;}}}
编写与TickVo.as对应的后台Model,如下:

package com.model;public class Tick {private String seqNo;private String messageCN;public String getMessageCN() {return messageCN;}public void setMessageCN(String messageCN) {this.messageCN = messageCN;}public String getSeqNo() {return seqNo;}public void setSeqNo(String seqNo) {this.seqNo = seqNo;}}
再创建一个Servlet类,如下:

package com.serverpush;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.model.Tick;import flex.messaging.MessageBroker;import flex.messaging.messages.AsyncMessage;import flex.messaging.util.UUIDUtils;public class TickCacheServlet extends HttpServlet {private static final long serialVersionUID = 1L;private static FeedThread thread;public TickCacheServlet() {super();}protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// 接收前台参数String cmd = request.getParameter("cmd");if (cmd.equals("start")) {start();}if (cmd.equals("stop")) {stop();}}public void start() {if (thread == null) {thread = new FeedThread();thread.start();}System.out.println("start!!");}public void stop() {thread.running = false;thread = null;}// 线程类,每隔多长时间发送一次public static class FeedThread extends Thread {public boolean running = true;public void run() {MessageBroker msgBroker = MessageBroker.getMessageBroker(null);String clientID = UUIDUtils.createUUID();int i = 0;while (running) {Tick tick = new Tick();tick.setMessageCN("今天下午6点更新程序需重启服务器");tick.setSeqNo(String.valueOf(i));System.out.println(i);AsyncMessage msg = new AsyncMessage();msg.setDestination("tick-data-feed");msg.setHeader("DSSubtopic", "tick");msg.setClientId(clientID);msg.setMessageId(UUIDUtils.createUUID());msg.setTimestamp(System.currentTimeMillis());msg.setBody(tick);msgBroker.routeMessageToService(msg, null);i++;try {Thread.sleep(2000);} catch (InterruptedException e) {}}}}}
如上类是一个重点,需要好好理解。下面进行文件的配置,如下:

service-config.xml文件源码:

<channel-definition id="my-streaming-amf"class="mx.messaging.channels.StreamingAMFChannel"><endpointurl="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf"class="flex.messaging.endpoints.StreamingAMFEndpoint" /><properties><idle-timeout-minutes>0</idle-timeout-minutes><max-streaming-clients>10</max-streaming-clients><server-to-client-heartbeat-millis>5000</server-to-client-heartbeat-millis><user-agent-settings><user-agent match-on="MSIE" kickstart-bytes="2048"max-streaming-connections-per-session="1" /><user-agent match-on="Firefox" kickstart-bytes="2048" max-streaming-connections-per-session="1" /></user-agent-settings></properties></channel-definition>
message-config.xml文件源码如下:

<destination id="tick-data-feed"><properties><server><allow-subtopics>true</allow-subtopics><subtopic-separator>.</subtopic-separator></server></properties><channels><channel ref="my-polling-amf" /><channel ref="my-streaming-amf" /></channels></destination>
点击button,启动监听。
然后在浏览器中输入:http://localhost:8080/项目名/Servlet映射路径?cmd=start,就可将订阅的信息进行推送了。











0 0
原创粉丝点击