BlazeDSでサーバープッシュ

BlazeDSでサーバープッシュするプログラムを作ってみました。

作りこむもの
・クライアント側(mxml)
・サーバ側(java)
・設定ファイル(services-config.xml,messaging-config.xml,remoting-config.xml)


クライアント側

[sample.mxml]



<![CDATA[
import mx.controls.Alert;
import mx.messaging.messages.IMessage;
import mx.events.ItemClickEvent;

public function receiveHandler(message:IMessage):void{
//受信MSGを設定
textarea.text = "" + message.body;
}
] ]>



//resubscribeInterval属性:再サブスクライブを試行する間隔
//message属性:受信後の処理






[ServerPushController.asファイル]

package
{
import flash.events.Event;
import flash.events.MouseEvent;

import mx.controls.Alert;
import mx.core.IMXMLObject;
import mx.events.FlexEvent;
import mx.rpc.AsyncResponder;
import mx.rpc.AsyncToken;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;

public class ServerPushController implements IMXMLObject
{
private var sp:ServerPush;
public function ServerPushController(){}

/**
* 初期化
*/
public function initialized(document:Object, id:String):void
{
sp = document as ServerPush;
sp.addEventListener(FlexEvent.CREATION_COMPLETE, push);
}

/**
* 初期設定
*/
public function push(event:Event):void
{
//メッセージ受信の受け付け開始
sp.cons.subscribe();
sp.startPush.addEventListener(MouseEvent.CLICK, startPush);
sp.endPush.addEventListener(MouseEvent.CLICK, endPush);
}

/**
* pollingの開始
*/
public function startPush(event:MouseEvent):void{
[]//サーバー側のスレッド開始[]
var token:AsyncToken = sp.server.startPush();
token.addResponder(new AsyncResponder(
function (e:ResultEvent, obj:Object=null):void {
},
function (e:FaultEvent, obj:Object=null):void {
Alert.show(e.fault.faultDetail + "\n" + e.fault.faultString );
}
));
}

/**
* polling終了
*/
public function endPush(event:MouseEvent):void{
sp.cons.unsubscribe();
}
}
}



サーバ側

[ServerPush.java]


package serv;
import flex.messaging.MessageBroker;
import flex.messaging.messages.AsyncMessage;
import flex.messaging.util.UUIDUtils;

public class ServerPush {

Thread th;

public void startPush(){
th = new ThreadExe();
th.start();
}

/**
*
*/
public class ThreadExe extends Thread{

@Override
public void run() {
MessageBroker mb = MessageBroker.getMessageBroker(null);
String clientId = UUIDUtils.createUUID();

for(int i = 0; i < 20; i++){
AsyncMessage am = new AsyncMessage();
am.setDestination("pushing");
//下記MessageIdを設定しないとエラーとなる。
am.setMessageId(UUIDUtils.createUUID());
am.setClientId(clientId);
am.setTimestamp(System.currentTimeMillis());
am.setBody("TEST..." + i);
mb.routeMessageToService(am, null);

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

設定ファイル

[services-config.xml]
















true
1




[messaging-config.xml]


















[remoting-config.xml]





serv.ServerPush