flex+blazeds+java后台消息推送(简单示例)

首先,新建一个web项目,添加开发flex需要的jar包,和blazeds相关文件,然后把web项目转成flex项目(不明白怎么弄没事,过几天会写一篇这样的文章),然后修改一下services-config.xml和messaging-config.xml文件,添加如下代码

services-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>

messaging-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>

OK,完了之后,我们新建一个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;

/**
* Servlet implementation class 
TickCacheServlet
*/
public class TickCacheServlet extends HttpServlet 
{
private static final long serialVersionUID = 1L;
private static 
FeedThread thread;

/**
* @see 
HttpServlet#HttpServlet()
*/
public TickCacheServlet() {
super();
// 
TODO Auto-generated constructor stub
}

/**
* @see 
HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* 
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;
}

/**
* 
@see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* 
response)
*/
protected void doPost(HttpServletRequest 
request,
HttpServletResponse response) throws ServletException, IOException 
{
doGet(request, response);
}
//线程类,每隔多长时间发送一次
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) {
}
}
}
}
}


在新建一个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;
}
}

后台就搞定了。下面看前台

新建一个mxml文件和一个VO文件
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 
x="72"
y="43"
text="Label"
id="txtTick"/>
<mx:Button 
x="132"
y="71"
label="Button"
click="submsg()"/>
</mx:Panel>
</s:Application>

VO,就是对应后台的model

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


}
}

ok,下面开始测试:运行mxml,界面如下
QQ截图未命名.gif 
点击button,启动监听。
然后在浏览器中输入: http://localhost:8080/serverPush/TickCacheServlet?cmd=start ,表示现在我要发消息了,当你运行了这个之后看看你刚才的那个mxml是不是有变化啦
QQ截图未命名.gif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值