前言:
有很多类似股票、外汇、期货等实时行情这种应用,客户端需要显示行情牌价等信息。
目前的作法是:客户端定时向服务器请求,无论数据是否有更新,都把数据发到客户端。
我们这里讲的一种技术不同以上这个做法,我们是采用服务器向客户端推的这种方式,该方式的好处不言自明。blazeds中有一个名为:StreamingAMFChannel 的通道,我们就是采用它来实现向客户端推这个功能。
环境准备:
我采用eclipse(wtp)+ flex3 build 的软件环境。软件安装我这里就不说明了。blazeds我采用的是blazeds_bin_3-0-0-544,其实你只要下载blazeds.war文件即可。
操作步骤:
1 、切换至flex development视图模式下,点右键新建一个Flex Project。
如我的项目名为:flex-blazeds
点击Next按纽,来到下一页面,
在这步中,直接点:Finish即可。
接下来,右键点击flex-blazeds项目,打开“属性”对话框,如下图:把红色圈起来的地方,改成红字部分。
点“OK”。
切换至“java开发视图”,新建名为:cn.bestwiz.design.tc 的包,在该包中,新建名为Tick.java的类,内容如下:
//Tick.java
package cn.bestwiz.design.tc;
import java.math.BigDecimal;
import java.util.Date;
public class Tick {
private BigDecimal askPrice;
private BigDecimal bidPrice;
private BigDecimal midPrice;
private Date tickTime;
private String seqno;
public String getSeqno() {
return seqno;
}
public void setSeqno(String seqno) {
this.seqno = seqno;
}
public BigDecimal getAskPrice() {
return askPrice;
}
public void setAskPrice(BigDecimal askPrice) {
this.askPrice = askPrice;
}
public BigDecimal getBidPrice() {
return bidPrice;
}
public void setBidPrice(BigDecimal bidPrice) {
this.bidPrice = bidPrice;
}
public BigDecimal getMidPrice() {
return midPrice;
}
public void setMidPrice(BigDecimal midPrice) {
this.midPrice = midPrice;
}
public Date getTickTime() {
return tickTime;
}
public void setTickTime(Date tickTime) {
this.tickTime = tickTime;
}
}
接下来,再新建一名为:cn.bestwiz.design.tc.servlet 的包,再切换至“j2ee视图”,在该视图模式下,新建一名为“TickCacheServlet.java”的Servlet.
点击“Finish”完成即可。
文件内容如下:
//TickCacheServlet
package cn.bestwiz.design.tc.servlet;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
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 FeedThread thread;
@Override
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();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
}
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
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.setAskPrice(new BigDecimal("100"));
tick.setBidPrice(new BigDecimal("100"));
tick.setMidPrice(new BigDecimal("100"));
tick.setTickTime(new Date());
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(20);
} catch (InterruptedException e) {
}
}
}
}
}
下一步加入flex配置文件。
flex的配置文件默认有四个,文件目录在WebContent\WEB-INF\flex目录下。
messaging-config.xml
proxy-config.xml
remoting-config.xml
services-config.xml
其实,这中间用的是一个,就是services-config.xml,只是在services-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>
再切换至flex 开发视图,新建一名为:Tick.as的ActionScript文件。
点击“Finish”按纽。
Tick.as文件内容如下:
//Tick.as
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;
}
}
再在main.mxml文件中,加入如下代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" viewSourceURL="srcview/index.html" height="378" width="426">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
import mx.messaging.Consumer;
import mx.messaging.Channel;
import mx.messaging.ChannelSet;
import mx.messaging.events.MessageEvent;
[Bindable]
public var tick:Tick;
public 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"]);
consumer.addEventListener(MessageEvent.MESSAGE, messageHandler);
consumer.subscribe();
Alert.show("click end");
}
private function messageHandler(event:MessageEvent):void
{
var tick:Tick = event.message.body as Tick;
txtTick.text = tick.seqno;
}
]]>
</mx:Script>
<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="41" label="Button" click="submsg(); "/>
</mx:Panel>
</mx:Application>
OK,至此,我们的代码全部结束了。
下面我们开始测试。
打开一个浏览器,在浏览器的地址栏中,输入:
http://localhost:8080/flex-blazeds/TickCacheServlet?cmd=start
再返回eclipse,在main.mxml文件上,单击右键,用Flex Application运行它。
之后,在打开的浏览器flash上,点击“Button”按纽,可以看到按纽之前的一个Label的Text一直有数字在增大。
分享到:
相关推荐
本文主要介绍如何使用Flex和BlazDS实现服务器向客户端的实时数据推送,这一技术常用于股票、外汇、期货等实时行情的应用。传统的做法是客户端定时向服务器请求数据,而BlazDS提供的StreamingAMFChannel通道则支持...
通过这些配置和编程,Blazeds使得服务器能够实时地将数据推送给客户端,实现了低延迟、高效的通信,极大地提升了用户体验。在实际应用中,开发者还需要考虑错误处理、安全性、性能优化等因素,以确保系统的稳定性和...
flex blazeds实现服务器向客户端推送数据 环境Eclipse Java EE IDE 服务apache-tomcat-7.0.23-windows-x86 blazeds采用的是blazeds4.0.0.14931 (附件中包含 apache-tomcat-7.0.23 + 源码 + 说明文档)
Flex + blazeds + Java推送Demo 本例实现由Flex一端客户端发送消息, 然后由Java端在发布到所有订阅的其它Flex端. 里面有说明与源码, 还有一个直接放到Tomcat里面的直接发布的项目 小编使用工具 eclipse3.5 flex sdk...
总之,“Flex + BlazeDS”是开发富互联网应用的一种强大组合,它利用Flex的可视化界面和BlazeDS的数据服务,实现了高效的客户端-服务器通信。学习和掌握这种技术,可以帮助开发者构建出功能丰富、交互性强的Web应用...
BlazeDS是Adobe提供的一个免费服务器端技术,它为Flex客户端提供了与Java应用程序交互的能力,包括实时消息传递、Remoting和数据推送等功能。Spring是一个广泛使用的Java企业级应用开发框架,它简化了Java应用程序的...
而BlazeDS是Adobe提供的一个免费服务器端组件,用于实现Flex与Java后端的数据通信。本文将深入探讨如何配置Flex与BlazeDS,让它们协同工作,实现高效、稳定的数据交换。 首先,我们需要准备必要的工具和环境。...
这个技术允许双向通信,即服务器可以主动向客户端推送数据,而不仅仅是响应客户端的请求。这种功能对于实时性要求高的应用,如股票交易、聊天室或者实时数据显示等场景非常有用。 在"BlazeDS实现java后台消息推送...
AMF是一种轻量级的二进制数据序列化协议,用于在Flex客户端和BlazeDS服务器之间传输对象。它能将复杂的数据结构转化为二进制流,使得数据传输更快,同时降低了网络带宽需求。 3. **数据推送**: BlazeDS支持...
5. **连接与通信**:Flex客户端通过HTTP或RTMP通道连接到BlazeDS服务器。用户登录后,可以订阅消息目的地,然后服务器在接收到新的聊天消息时,会自动推送给已订阅的客户端。 在提供的文件中,`userlists.sql`可能...
3. **Real-time Data Push**:BlazeDS支持Server-Sent Events和Long Polling,实现数据的实时推送,使Flex客户端能够实时更新视图。 4. **Security**:在整合过程中,确保数据安全是非常重要的。可以通过配置...
AMF是一种二进制数据格式,用于在Flex客户端和BlazeDS服务器之间高效地传输数据。相比于XML或JSON,AMF的解析速度更快,数据量更小,因此在处理大量数据时效率更高。BlazeDS将Java对象转换为AMF格式,使Flex客户端...
- 响应式编程:BlazeDS支持服务器向客户端的自动数据推送,例如,当数据库中的数据改变时,客户端可以实时接收到更新。 6. 示例应用 - 创建一个Flex UI,展示从Java后端获取的数据。 - 实现一个简单的CRUD应用,...
3. **Live Data Push**:BlazeDS支持服务器向客户端推送数据,而不仅仅是响应客户端请求。这种推送技术(如Long Polling、Comet等)使得实时应用(如股票交易、聊天室等)成为可能,无需客户端不断轮询服务器。 4. ...
综上所述,"Flex BlazeDs 推数据生成lineChart实例"是一个整合了Flex前端、BlazeDS数据推送服务和实时图表展示的综合应用,它展示了如何利用这些技术实现高效的实时数据监控。通过理解并掌握这个实例,开发者可以在...
BlazeDS则是Adobe提供的一个开源服务器端组件,它为Flex应用程序提供了实时的数据推送服务,使得Web应用可以实现双向通信,即服务器可以主动向客户端推送数据,而不仅仅是客户端请求数据。 Flex主要由以下组件构成...