您的位置:首页 > 编程语言 > Java开发

java服务器向flex客户端一对一推送数据

2011-05-06 19:23 375 查看
 结合其他前辈所编写的采用BlazeDS的发布-订阅机制实现的一对多的实现,在此基础上采用flex的消息服务的选择过滤功能实现一对一.(其中Tick文件和TickCacheServlet主要部分和flex_blazeds.mxml部分代码为网上前辈所作)

Tick.java

package cn.bestwiz.design.tc.servlet;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.bestwiz.design.tc.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;

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

//		String cmd = req.getParameter("cmd");
//		if (cmd.equals("start")) {
//			start();
//		}
//		if (cmd.equals("stop")) {
//			stop();
//		}
doPost(req, resp);
}

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

start();

}

public void destroy() {
super.destroy();
}

public void init() throws ServletException {
super.init();
}

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.setSeqno(String.valueOf(i));
System.out.println(i);

AsyncMessage msg = new AsyncMessage();
msg.setDestination("tick-data-feed");
msg.setHeader(AsyncMessage.SUBTOPIC_HEADER_NAME, "tick");
/*
* 在此添加过滤
*/
Map headers=new HashMap();
headers.put("prop1", 10);
msg.setHeaders(headers);

msg.setClientId(clientID);
msg.setMessageId(UUIDUtils.createUUID());
msg.setTimestamp(System.currentTimeMillis());
msg.setBody(tick);
msgBroker.routeMessageToService(msg, null);

try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
}
}
}
}


 

 

flex_blazeds.mxml

 
package
{
[RemoteClass(alias="cn.bestwiz.design.tc.Tick")]
[Bindable]
public class Tick
{
public var askPrice:Number;
public var bidPrice:Number;
public var midPrice:Number;
public var tickTime:Date;;
public var seqno:String;
}

}


triggerServlet.mxml为促发servlet服务

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


在services-config.xml中添加channel

在web.xml文件中添加

<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>TickCacheServlet</servlet-name>
<servlet-class>cn.bestwiz.design.tc.servlet.TickCacheServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>TickCacheServlet</servlet-name>
<url-pattern>/TickCacheServlet</url-pattern>
</servlet-mapping>


 

至此大功告成,首先将项目发布到tomcat上,然后运行triggerservlet和flex_blazeds.mxml,在未发布(触发)之前,订阅端flex_blazeds.mxml是接收不到任何消息,触发之后则能够接到消息.

 

该工作完成感谢网上各位前辈的经验给我的指导,在此有所转载望前辈谅解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息