您的位置:首页 > 其它

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

2014-05-14 18:46 381 查看
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">
			<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,就可将订阅的信息进行推送了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: