flex采用blazeds实现服务器向客户端推数据
前言:
有很多類似股票、外匯、期貨等實時行情這種應用,客戶端需要顯示行情牌價等信息。
目前的作法是:客戶端定時向服務器請求,無論數據是否有更新,都把數據發到客戶端。
我們這里講的一種技術不同以上這個做法,我們是采用服務器向客戶端推的這種方式,該方式的好處不言自明。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項目,打開“屬性”對話框,如下圖:把紅色圈起來的地方,改成紅字部分。
?
切換至“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;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String cmd = req.getParameter("cmd");if (cmd.equals("start")) {start();}if (cmd.equals("stop")) {stop();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// TODO Auto-generated method stubsuper.doGet(req, resp);}@Overridepublic void destroy() {// TODO Auto-generated method stubsuper.destroy();}@Overridepublic void init() throws ServletException {// TODO Auto-generated method stubsuper.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实现服务器向客户端推数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带宽限制下的视觉实体属性传播
- 下一篇: delphi和 java通过socket