java flex 推送_Flex数据推送

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

1.完成Flex+BlazeDS+Spring整合

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

修改配置文件

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

0

10

5000

0

10

5000

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

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

后台推送数据

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

packagedemo.flex.service;

importjavax.annotation.Resource;

importorg.springframework.flex.messaging.AsyncMessageCreator;

importorg.springframework.flex.messaging.MessageTemplate;

importorg.springframework.stereotype.Service;

importflex.messaging.messages.AsyncMessage;

importflex.messaging.util.UUIDUtils;

@Service

publicclassDataPushService {

@Resource

privateMessageTemplate messageTemplate;

publicvoidpush(String topic, Object data) {

messageTemplate.send(newCustomAsyncMessageCreator(topic, data));

}

classCustomAsyncMessageCreatorimplementsAsyncMessageCreator {

privateString topic;

privateObject data;

publicCustomAsyncMessageCreator(String topic, Object data) {

this.topic = topic;

this.data = data;

}

@Override

publicAsyncMessage createMessage() {

AsyncMessage msg = newAsyncMessage();

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);

returnmsg;

}

}

}

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,每隔一秒推送当前系统时间

packagedemo.flex.mvc;

importjava.text.SimpleDateFormat;

importjava.util.Date;

importjavax.annotation.Resource;

importorg.springframework.stereotype.Controller;

importorg.springframework.web.bind.annotation.RequestMapping;

importdemo.flex.service.DataPushService;

@Controller

publicclassDataPush {

privatestaticFeedThread thread;

@Resource

privateDataPushService dataPushService;

@RequestMapping("push")

publicString push(String cmd)throwsException {

if("start".equals(cmd)) {

start();

}

else{

stop();

}

return"push";

}

privatevoidstart() {

if(thread ==null) {

thread = newFeedThread();

thread.start();

}

System.out.println("开始数据推送...");

}

privatevoidstop() {

thread.running = false;

thread = null;

System.out.println("结束数据推送...");

}

publicclassFeedThreadextendsThread {

publicbooleanrunning =true;

privateSimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");

publicvoidrun() {

while(running) {

String time = sdf.format(newDate());

System.out.println(">>>>>>>>>>>"+ time);

// time为订阅主题

dataPushService.push("time", time);

try{

Thread.sleep(1000);

} catch(InterruptedException e) {

}

}

}

}

}

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/*

Spring MVC Dispatcher Servlet

/mvc/*

lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

lt;/bean>

前台订阅功能

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

privatevarconsumer:Consumer;

protectedfunctionshowTimeHandler(event:MouseEvent):void

{

if(consumer ==null) {

consumer = newConsumer();

// consumer设置的参数要与后台配置对应

consumer.destination = "data_push";

consumer.channelSet = newChannelSet(["my-streaming-amf","my-polling-amf"]);

// 只能收到主题为time的订阅消息

consumer.subtopic = "time";

//添加message的监听,当后台有消息发送时,调用messageHandler

consumer.addEventListener(MessageEvent.MESSAGE, messageHandler);

// 订阅

consumer.subscribe();

}

}

protectedfunctionhideTimeHandler(event:MouseEvent):void

{

if(consumer !=null) {

// 取消订阅

consumer.unsubscribe();

consumer.removeEventListener(MessageEvent.MESSAGE, messageHandler);

consumer = null;

timeText.text = "systime";

}

}

privatefunctionmessageHandler(event:MessageEvent):void

{

vartime:String = event.message.body as String;

timeText.text = 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会根据配置文件中设定的时间间隔,每过一段时间发送一次订阅请求,获得后台订阅的信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值