`
xianzhideng
  • 浏览: 60695 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

flex采用blazeds实现服务器向客户端推数据

    博客分类:
  • RIA
阅读更多

前言:
有很多类似股票、外汇、期货等实时行情这种应用,客户端需要显示行情牌价等信息。
目前的作法是:客户端定时向服务器请求,无论数据是否有更新,都把数据发到客户端。
我们这里讲的一种技术不同以上这个做法,我们是采用服务器向客户端推的这种方式,该方式的好处不言自明。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采用blazeds实现服务器向客户端推数据.doc

    flex采用blazeds实现服务器向客户端推数据

    Flex 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推送

    Flex + blazeds + Java推送Demo 本例实现由Flex一端客户端发送消息, 然后由Java端在发布到所有订阅的其它Flex端. 里面有说明与源码, 还有一个直接放到Tomcat里面的直接发布的项目 小编使用工具 eclipse3.5 flex sdk...

    构建全栈式Flex、BlazeDS和Spring集成解决方案

    JBoss作为应用服务器、MySQL作为数据存储、Hibernate完成数据访问、Spring用来构建业务层、BlazeDS作为远程服务、 Flex用来构建富客户端,使用Maven及flex-compiler-mojo插件进行项目构建,打造全栈式Flex、BlazeDS...

    在eclipse中同时开发j2ee模块和flex_客户端模块DOC

    Eclipse 通过 wtp 插件对 j2ee web app 的开发提供了很好的支持 ,flex builder plugin 是基于 eclipse 的一个用于开发 flex 应用程序的插件 ,blazeds 是一个用于集成 flex 客户端和 j2ee server 的组件 , 下面介绍...

    Flex企业应用开发实战源代码

    接着剖析了Flex与Java的通信机制,以及Flex企业应用的客户端架构和服务器端架构;再接着详细讲解了BlazeDS框架的使用方法和工作原理,并通过迭代的方式完整地演示一个真实的Flex企业级应用的开发全过程,实战性极强...

    pureMVC 实例

    一个以pureMVC为flex前端框架,blazeds为通信服务器,spring和hibernate为服务端框架,实现了增删改等功能的完整实例,数据库使用mysql,部分关键地方加了注释,enjoy!

    Flex企业应用开发实战.rar

    接着剖析了Flex与Java的通信机制,以及Flex企业应用的客户端架构和服务器端架构;再接着详细讲解了BlazeDS框架的使用方法和工作原理,并通过迭代的方式完整地演示一个真实的Flex企业级应用的开发全过程,实战性极强...

    blazeDS.war

    BlazeDS中包含了AMF 的 Java 实现,可以用来与服务器端的Java对象远程交互,也可以用来在客户端之间传递消息。...开发人员可以通过其消息系统从客户端向服务器端发送消息,当然也可从服务器端向客户端发送消息。

    Blazeds + Stuts2 + Spring3 + Jpa(Hibernate) + 主动推送消息

    这是BlazeDS的java端工程,其中用的是flex-spring插件,并且实现了服务器主动推送消息给客户端,工程是用maven3来管理的。 另外工程中用到了Struts2 + spring + jpa的整合,其中Struts2与BlazeDS无关。

    Flex企业应用开发实战-迷你版-电子书

    接着剖析了Flex与Java的通信机制,以及Flex企业应用的客户端架构和服务器端架构;再接着详细讲解了BlazeDS框架的使用方法和工作原理,并通过迭代的方式完整地演示一个真实的Flex企业级应用的开发全过程,实战性极强...

    BlazeDS开发者向导

    BlazeDS 是由 Adobe 公司免费发布,基于 Java 远程对象和 Web 消息服务, 面向 Adobe Flex 客户端和 AIR (Adobe Integrated Runtime) RIA (Rich ...本文档介绍 BlazeDS开发环境,创建客户端和服务器端应用程序

    FLEX企业开放实战

    接着剖析了Flex与Java的通信机制,以及Flex企业应用的客户端架构和服务器端架构;再接着详细讲解了BlazeDS框架的使用方法和工作原理,并通过迭代的方式完整地演示一个真实的Flex企业级应用的开发全过程,实战性极强...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    不过,针对 Java EE 开发的服务器端应用,可以通过集成 BlazeDS,充分利用 AMF 协议并能轻易与 Flex 前端交换数据,这种方式是 Java EE 应用程序集成 Flex 的首选。 BlazeDS 是 Adobe LifeCycle Data Services 的...

    FLEX企业应用开发实战.pdf

    接着剖析了Flex与Java的通信机制,以及Flex企业应用的客户端架构和服务器端架构;再接着详细讲解了BlazeDS框架的使用方法和工作原理,并通过迭代的方式完整地演示一个真实的Flex企业级应用的开发全过程,实战性极强...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    不过,针对 Java EE 开发的服务器端应用,可以通过集成 BlazeDS,充分利用 AMF 协议并能轻易与 Flex 前端交换数据,这种方式是 Java EE 应用程序集成 Flex 的首选。 BlazeDS 是 Adobe LifeCycle Data Services 的...

    ServerPush

    以告警数据为例,告警数据通过mq、socket等方式进入系统,在java服务器通过监听来监听消息队列数据,接收后推送到flex各个客户端。blazeDS采用amf协议。该协议可以传输Object, Array, Date, XML。由于AMF采用二进制...

    将Flex集成到JavaEE应用程序的最佳实践

    本文内容包括:开发环境现有的JavaEE应用集成BlazeDS开发Flex客户端增强RemoteObject对象下载参考资料传统的JavaEE应用程序通常使用某种MVC框架(例如,Struts)作为前端用户界面,随着Flex的兴起,基于RIA的客户端...

Global site tag (gtag.js) - Google Analytics