Flex 4.1 + BlazeDS(Demo实例)实现信息订阅推送
发布时间:2020-12-15 03:45:08 所属栏目:百科 来源:网络整理
导读: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.
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,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"> <endpoint url="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 ,就可将订阅的信息进行推送了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |