Flex之旅--Flex数据推送

        本文介绍怎样使用Flex数据推送实现前台消息订阅,是在前面Flex+BlazeDS+Spring整合基础上进行的,利用Spring来简化配置。环境准备:

                1.完成Flex+BlazeDS+Spring整合

                2.修改项目根目录下.flexProperties文件中serverContextRoot为项目名,否则后台接收不到前台订阅信息(此处浪费了我很多时间,一定注意)

        修改配置文件

        1.修改WEB-INF/flex/services-config.xml,添加如下代码:


	
	
		0
		10
		5000
		
			
			
		
	
        2.修改Spring配置文件applicationContext.xml,把替换为如下代码:

 	
 	
	
		
	
 	
 	
其中"my-streaming-amf,my-polling-amf"要在services-config.xml中配置,messageTemplate在代码中实现推送功能。

        后台推送数据

        1.添加推送数据Service,代码如下,注意msg设置的各参数,前后台及配置文件都要对应

package demo.flex.service;

import javax.annotation.Resource;

import org.springframework.flex.messaging.AsyncMessageCreator;
import org.springframework.flex.messaging.MessageTemplate;
import org.springframework.stereotype.Service;

import flex.messaging.messages.AsyncMessage;
import flex.messaging.util.UUIDUtils;

@Service
public class DataPushService {

	@Resource
	private MessageTemplate messageTemplate;
	
	public void push(String topic, Object data) {
		messageTemplate.send(new CustomAsyncMessageCreator(topic, data));
	}
	
	class CustomAsyncMessageCreator implements AsyncMessageCreator {
		
		private String topic;
		private Object data;
		
		public CustomAsyncMessageCreator(String topic, Object data) {
			this.topic = topic;
			this.data = data;
		}
		
		@Override
		public AsyncMessage createMessage() {
			AsyncMessage msg = new AsyncMessage();
			
			msg.setClientId(UUIDUtils.createUUID());
			msg.setMessageId(UUIDUtils.createUUID());
			msg.setTimestamp(System.currentTimeMillis());
			msg.setDestination("data_push");	// 必须和配置文件中message-destination相同
			msg.setHeader("DSSubtopic", topic);	// 设置订阅主题
			msg.setBody(data);
			
			return msg;
		}
	}
}

        2.添加控制数据开始推送及结束推送Controller,每隔一秒推送当前系统时间

package demo.flex.mvc;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import demo.flex.service.DataPushService;

@Controller
public class DataPush {

	private static FeedThread thread;
	
	@Resource
	private DataPushService dataPushService;
	
	@RequestMapping("push")
	public String push(String cmd) throws Exception {
		
		if ("start".equals(cmd)) {
			start();
		}
		else {
			stop();
		}
		
		return "push";
	}
	
	private void start() {
		if (thread == null) {
			thread = new FeedThread();
			thread.start();
		}
		System.out.println("开始数据推送...");
	}

	private void stop() {
		thread.running = false;
		thread = null;
		System.out.println("结束数据推送...");
	}
	
	public class FeedThread extends Thread {
		public boolean running = true;
		private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		public void run() {

			while (running) {
				String time = sdf.format(new Date());
				System.out.println(">>>>>>>>>>>" + time);
				
				// time为订阅主题
				dataPushService.push("time", time);
				
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
				}
			}
		}
	}
}
        3.为使DataPush能够正常运行,修改web.xml及applicationContext.xml配置,添加如下代码:

	
	
		Spring MVC Dispatcher Servlet
		/mvc/*
	
 	
	  
		  
		 
		
	 

        前台订阅功能

        前台FlexDemo.mxml中添加如下代码,订阅主题为time的消息,用于显示后台系统时间

		
			
			
			
			
				

			private var consumer:Consumer;
			
			protected function showTimeHandler(event:MouseEvent):void
			{
				if (consumer == null) {
					consumer = new Consumer(); 
				
					// consumer设置的参数要与后台配置对应
					consumer.destination = "data_push"; 
					consumer.channelSet = new ChannelSet(["my-streaming-amf","my-polling-amf"]);
					
					// 只能收到主题为time的订阅消息
					consumer.subtopic = "time"; 
					
					//添加message的监听,当后台有消息发送时,调用messageHandler 
					consumer.addEventListener(MessageEvent.MESSAGE, messageHandler); 
					
					// 订阅
					consumer.subscribe();
				}
			}
			
			protected function hideTimeHandler(event:MouseEvent):void
			{
				if (consumer != null) {
					
					// 取消订阅
					consumer.unsubscribe();
					consumer.removeEventListener(MessageEvent.MESSAGE, messageHandler); 
					consumer = null;
					timeText.text = "systime"; 
				}
			}

			private function messageHandler(event:MessageEvent):void 
			{ 
				var time:String = event.message.body as String; 
				timeText.text = time; 
			}

消息订阅也可以采用MultiTopicProducer,能够在单个消息处理程序中同时订阅主题,通过addSubscription(topic)方法订阅主题,removeSubscription(topic)取消订阅。Consumer只能订阅单个主题。

        所有代码已写完,启动项目进行测试!

        1.订阅消息:打开链接http://localhost:8080/FlexDemo/FlexDemo.html,点击显示时间订阅time消息,点击隐藏时间取消订阅

        2.推送消息:打开链接http://localhost:8080/FlexDemo/mvc/push?cmd=start推送消息,http://localhost:8080/FlexDemo/mvc/push?cmd=stop停止推送

        经过测试,my-streaming-amf、my-polling-amf两个通道都可以实现消息推送订阅,但my-streaming-amf发送订阅请求后会一直维护这一个请求直到取消订阅,my-polling-amf会根据配置文件中设定的时间间隔,每过一段时间发送一次订阅请求,获得后台订阅的信息。

        最后附完整代码下载地址:http://download.csdn.net/detail/sjepy/5522399


你可能感兴趣的:(Flex开发,新的征程)