`
shine1200
  • 浏览: 41557 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

flex采用blazeds实现服务器向(特定标识的)客户端推数据(基于consumer模式)

    博客分类:
  • flex
阅读更多
前言:
有很多类似股票、外汇、期货等实时行情这种应用,客户端需要显示行情牌价等信息。
目前的作法是:客户端定时向服务器请求,无论数据是否有更新,都把数据发到客户端。
我们这里讲的一种技术不同以上这个做法,我们是采用服务器向客户端推的这种方式,该方式的好处不言自明。blazeds中有一个名为:StreamingAMFChannel 的通道,我们就是采用它来实现向客户端推这个功能。
Tick.java :

package test;

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


}

FeedThread .java :

public static class FeedThread extends Thread {
  private String uid;
 
        public void setUid(String uid) {
   this.uid = uid;
  }

  public FeedThread(String uid){
         this.uid = uid;
        }
        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+"--"+uid);
              
                AsyncMessage msg = new AsyncMessage();
                msg.setDestination("tick-data-feed");
                msg.setHeader("DSSubtopic", "tick"+uid);
                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) {
                }

            }
        }
    }

UserService.java :

package sws.service;

import module.User;

public interface UserService {
  public void Test(String uid);
  public void stop(String uid);
}

UserServiceImpl.java :

package sws.service;

import java.util.HashMap;
import java.util.Map;

import module.User;

import org.springframework.beans.factory.annotation.Autowired;

import sws.dao.UserDao;
import test.TickServlet.FeedThread;


public class UserServiceImpl implements UserService {
private static Map<String,Thread> map = new HashMap<String,Thread>();

public void Test(String uid) {
   Boolean b = map.containsKey(uid);
   if(!b){
   FeedThread thread = new FeedThread(uid);
   thread.start();
   map.put(uid, thread);
   }
}

public void stop(String uid) {
  FeedThread thread = (FeedThread)map.get(uid);
  thread.running = false;
}

}

下一步加入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>


Tick.as文件内容如下:
//Tick.as
package
    {
    [RemoteClass(alias="test.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.rpc.events.FaultEvent;
            import mx.messaging.Consumer;
            import mx.messaging.Channel;
            import mx.messaging.ChannelSet;
            import mx.messaging.events.MessageEvent;
           
            [Bindable]
            public var tick:Tick;
            public function postUrl():void {
//            
//             httpservice.url = "http://localhost:8080/test/servlet/TickServlet?cmd=start&uid="+telId.text;
//                httpservice.send();
//                httpservice.addEventListener(ResultEvent.RESULT,resultHandler);
//                httpservice.addEventListener(FaultEvent.FAULT,faultHandler);
         user.Test(telId.text);
            }
            public function resultHandler(event:ResultEvent):void{
                submsg();
              }
            public function faultHandler(event:FaultEvent):void{
                trace(event.fault);
              }
            public function submsg():void
            { 
             
                var consumer:Consumer = new Consumer();
                consumer.destination = "tick-data-feed";
                consumer.subtopic = "tick"+telId.text;
                consumer.channelSet = new ChannelSet(["my-streaming-amf"]);
                consumer.addEventListener(MessageEvent.MESSAGE, messageHandler);
                consumer.subscribe();
            }
           
            private function messageHandler(event:MessageEvent):void
            {

                 tick = event.message.body as Tick;
            
                txtTick.text = tick.seqno;
            }
            private function stop():void {
             user.stop(telId.text);
            }
        ]]>
    </mx:Script>

    //RemoteObject 的方式远程调用java类 userService在rremoting-config.xml中配置
    <mx:RemoteObject id="user" destination="userService" source="userService" result="resultHandler(event)"/>
    <mx:HTTPService id="httpservice" />
    <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="start" click="postUrl(); "/>
        <mx:TextInput  id="telId"  x="37" y="83"/>//标识用户
        <mx:Button label="stop" click="stop();" x="216" y="41"/>
    </mx:Panel>
</mx:Application>


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aini281032/archive/2010/03/12/5367795.aspx
分享到:
评论

相关推荐

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

    本文主要探讨如何利用Flex和BlazDS实现服务器向客户端的数据推送功能,尤其适用于实时性强的应用,如股票、外汇和期货市场的实时行情显示。 BlazDS是Adobe提供的一个开源服务器端解决方案,它允许Flex客户端与Java...

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

    本文主要介绍如何使用Flex和BlazDS实现服务器向客户端的实时数据推送,这一技术常用于股票、外汇、期货等实时行情的应用。传统的做法是客户端定时向服务器请求数据,而BlazDS提供的StreamingAMFChannel通道则支持...

    Flex + blazeds + Java推送

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

    Blazeds向客户端推送数据.

    它提供了在服务器和客户端之间双向通信的能力,使得服务器能够主动地向客户端推送数据,而不仅仅是响应客户端的请求。这种功能在实时性要求较高的应用中,如股票交易、实时聊天或游戏等场景,显得尤为重要。 在...

    基于Java_BlazeDS_Flex_服务器消息推的聊天室

    Java BlazeDS Flex 服务器消息推技术是Web应用程序中实现实时通信的一种有效方法,尤其适用于构建交互性强的聊天室等应用。BlazeDS是Adobe提供的一个开源项目,它为Java服务器和Flex客户端之间的数据交换提供了丰富...

    flex + blazeDs

    总之,“Flex + BlazeDS”是开发富互联网应用的一种强大组合,它利用Flex的可视化界面和BlazeDS的数据服务,实现了高效的客户端-服务器通信。学习和掌握这种技术,可以帮助开发者构建出功能丰富、交互性强的Web应用...

    使用BlazeDS实现flex与java 整合

    BlazeDS是Adobe公司推出的一款开源的服务器端技术,它主要的作用是为Flex客户端与Java后端应用提供数据集成和实时通信。BlazeDS通过AMF(Action Message Format)协议,实现了高性能、低延迟的数据传输,使得Flex...

    flex+blazeds+spring

    BlazeDS是Adobe提供的一个免费服务器端技术,它为Flex客户端提供了与Java应用程序交互的能力,包括实时消息传递、Remoting和数据推送等功能。Spring是一个广泛使用的Java企业级应用开发框架,它简化了Java应用程序的...

    FLEX_Blazeds数据推送技术

    FLEX,BlazeDS,JAVA实现服务器端数据推送技术,下载后直接导到你的MYECLIPSE即可运行。先在IE内输入:http://localhost:8080/pushDemo/flex/pushDemo.html,点击“button”后,再另一个IE窗口内输入:...

    flex 工具 blazeds

    Flex工具BlazDS是Adobe公司推出的一款用于构建富互联网应用程序(RIA)的服务器端技术,主要目的是为了实现Flex客户端与Java后端之间的数据交互。它提供了丰富的数据服务,包括Remoting和 Messaging,使得Flex开发者...

    flex+blazeDS配置指南

    而BlazeDS是Adobe提供的一个免费服务器端组件,用于实现Flex与Java后端的数据通信。本文将深入探讨如何配置Flex与BlazeDS,让它们协同工作,实现高效、稳定的数据交换。 首先,我们需要准备必要的工具和环境。...

    Flex基于Blazeds上传下载

    标题中的“Flex基于Blazeds上传下载”是指使用Adobe Flex技术与BlazeDS服务进行文件上传和下载的实现方法。Flex是一种开源的、基于ActionScript的框架,常用于构建富互联网应用程序(RIA)。BlazeDS是Adobe提供的一...

    Flex+blazeds实现与mySQL连接数据库

    而 BlazeDS 是一款免费的服务器端 Java 软件,它作为 Flex 应用程序与 Java 后端服务之间通信的桥梁,实现了高效的数据交换与实时消息传递。 #### 二、Flex 与 BlazeDS 的结合优势 1. **高性能通信**:通过 ...

    spring3+ActiveMQ+blazeds+flex consumer

    BlazeDS是Adobe开发的一套用于富互联网应用程序(RIA)的数据和服务连接工具,它可以将服务器端数据实时推送到Flex客户端。在Spring和ActiveMQ的基础上,BlazeDS提供了一种灵活的方式来创建和消费AMF(Action ...

    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在企业开发中的应用

    企业可以利用Flex构建更直观、易用的应用界面,同时利用BlazeDS实现高效的服务器与客户端通信,从而提升整体应用性能。 总的来说,Flex和BlazeDS的结合为企业开发提供了强大的工具集,不仅能够构建出具有吸引力的...

    Flex之BlazeDS文档

    Flex和AIR程序使用Flex组件与BlazeDS服务器进行通信,包括RemoteObject、HTTPService、WebService、Producer和Consumer等组件。这些组件都是Flex SDK的一部分。除了Flex或AIR之外,也可以结合使用HTML和JavaScript...

    最简单的BlazeDS实现flex与java通信.rtf

    最简单的BlazeDS实现flex与java通信..无积分下载...最简单的BlazeDS实现flex与java通信..无积分下载...最简单的BlazeDS实现flex与java通信..无积分下载...最简单的BlazeDS实现flex与java通信..无积分下载...最简单的...

    Flex BlazeDs 推数据生成lineChart实例

    Flex BlazeDs推数据生成lineChart实例是一个典型的前端与后端实时通信的应用场景,它结合了Adobe Flex技术用于前端用户界面的构建,BlazeDS作为数据推送服务,以及使用lineChart组件来展示动态更新的数据。...

Global site tag (gtag.js) - Google Analytics