本エントリーではModule作成の例としてRoomModuleの作成を紹介します。UnionのバージョンはUnion alpha3を使用します。Union alpha4での動作も確認済みです。
作成するRoom Moduleの概要
ReactorからtwitというModule Messageを送信すると、Union Serverがtwitterにtwitするという機能を作ってみます。
- Reactorから今回作成するRoom Moduleが動作するRoomへ接続する
- RoomインスタンスのsendModuleMessage()メソッドからtwitというModule Messageを送信
- Room Moduleは受け取ったModule Messageをtwitterに投稿する
Room Moduleの大枠の作成
com.asmple.server.union.module.roomパッケージ内にTwitModuleSampleというクラスを作成します。
package com.asmple.server.union.module.room;
import net.user1.union.core.context.ModuleContext;
public class TwitModuleSample implements Module {
@Override
public boolean init(ModuleContext ctx) {
return true;
}
@Override
public void shutdown() {
// TODO Auto-generated method stub
}
}
Module Messageのイベントをハンドリングする
Module Messageのイベントハンドリング機能を追加するしたものが下記です。
package com.asmple.server.union.module.room;
import java.util.Map;
import net.user1.union.api.Message;
import net.user1.union.api.Module;
import net.user1.union.core.context.ModuleContext;
import net.user1.union.core.event.RoomEvent;
public class TwitModuleSample implements Module {
@Override
public boolean init(ModuleContext ctx) {
// Room Module Messageを受信した際のイベントを監視
ctx.getRoom().addEventListener(RoomEvent.MODULE_MESSAGE, this, "onModuleMessage");
return true;
}
/**
* Module Message受信時に実行されるメソッド
* @param evt
*/
public void onModuleMessage(RoomEvent evt) {
Message message = evt.getMessage();
Map params = message.getArgs();
// Module Message名を確認
if (message.getMessageName().equals("twit")) {
// 引数オブジェクトからtextプロパティを取得する
String text = (String)params.get("text");
}
}
@Override
public void shutdown() {
// TODO Auto-generated method stub
}
}
Module Messageイベントを監視
リスナー登録はこのように行います。AS3と似た構文で記述可能です。
ctx.getRoom().addEventListener(RoomEvent.MODULE_MESSAGE, this, "onModuleMessage");
onModuleMessageハンドラ
ハンドラ内でメッセージの名前を確認し、引数のオブジェクトを取得します。これらの値を使ってtwitterと連携すれば良さそうですね。
public void onModuleMessage(RoomEvent evt) {
Message message = evt.getMessage();
Map params = message.getArgs();
// Module Message名を確認
if (message.getMessageName().equals("twit")) {
// 引数オブジェクトからtextプロパティを取得する
String text = (String)params.get("text");
}
}
Twitterに投稿する機能を追加する準備
twitterのアカウントをお持ちでない方は、twitterアカウントのidとpasswordを用意してください。
twitter4jの導入
Twitter4Jからtwitter4j-2.0.9.zipをダウンロードしてきます。
アーカイブを解凍したら、twitter4j-2.0.9.jarをUnion Serverをインストールしたディレクトリのlib配下へコピーします。
eclipseのライブラリパスを設定
[swfobj src="http://fla.la/wp-content/uploads/2009/09/union_platform008_001.swf?startingPlaybackMode=1" alt="ライブラリパスに.jarを追加する" align="center" width="512" height="312"]
- Package Explorerでunion_platform(プロジェクト名)からコンテキストメニューを表示します。
- Propertiesを選択します。
- JAVA Build PathからLibrariesタブを選択します。
- Add JARsボタンをクリックします。
- 先ほど追加したlib/twitter4j-2.0.9.jarを選択します。
startup.bat(.sh)の編集
前回のstartup.bat(.sh)に追記していきます。前回の記事をお読みでない方は、Union Platform(7) Union Server Module作成準備を参照して下さい。
Windows環境の場合はstartup.batを編集します。
java -cp libunion.jar;libstax-api-1.0.1.jar;libwstx-asl-3.2.6.jar;libcom-asmple-server-union-module.jar net.user1.union.core.UnionMain start
;libcom-asmple-server-union-module.jarの後ろに以下を追記します。
;libtwitter4j-2.0.9.jar
変更後は以下のようになります。
java -cp libunion.jar;libstax-api-1.0.1.jar;libwstx-asl-3.2.6.jar;libcom-asmple-server-union-module.jar;libtwitter4j-2.0.9.jar net.user1.union.core.UnionMain start
Mac OS X, Linux環境の場合はstartup.shを編集します。
#!/bin/sh java -cp lib/union.jar:lib/stax-api-1.0.1.jar:lib/wstx-asl-3.2.6.jar:lib/com-asmple-server-union-module.jar net.user1.union.core.UnionMain start &
lib/com-asmple-server-union-module.jarの後ろに以下を追記します。
:lib/twitter4j-2.0.9.jar
変更後は以下のようになります。
#!/bin/sh java -cp lib/union.jar:lib/stax-api-1.0.1.jar:lib/wstx-asl-3.2.6.jar:lib/com-asmple-server-union-module.jar:lib/twitter4j-2.0.9.jar net.user1.union.core.UnionMain start &
Twitter4Jを組み込む
実際にTwitter4Jを組み込んだものが以下のコードです。
package com.asmple.server.union.module.room;
import java.net.URLDecoder;
import java.util.Map;
import twitter4j.Status;
import twitter4j.Twitter;
import net.user1.union.api.Message;
import net.user1.union.api.Module;
import net.user1.union.core.context.ModuleContext;
import net.user1.union.core.event.RoomEvent;
public class TwitModuleSample implements Module {
private Twitter twitter;
// twitterのidを設定
private static final String TWITTER_ID = "your twitter id";
// twitterのpassowrdを設定
private static final String TWITTER_PW = "your twitter password";
@Override
public boolean init(ModuleContext ctx) {
// Room Module Messageを受信した際のイベントを監視
ctx.getRoom().addEventListener(RoomEvent.MODULE_MESSAGE, this, "onModuleMessage");
// twitter用インスタンスの生成
twitter = new Twitter(TWITTER_ID, TWITTER_PW);
return true;
}
/**
* Module Message受信時に実行されるメソッド
* @param evt
*/
public void onModuleMessage(RoomEvent evt) {
Message message = evt.getMessage();
Map params = message.getArgs();
// Module Message名を確認
if (message.getMessageName().equals("twit")) {
// 引数オブジェクトからtextプロパティを取得する
String text = (String)params.get("text");
text = URLDecoder.decode(text);
// twitterへ書き込みをする
try {
Status status = twitter.update(text + " #union");
evt.getRoom().sendMessage(
"response", "ok",
"http://twitter.com/"
+ TWITTER_ID + "/status/" + status.getId());
} catch (Exception e) {
evt.getRoom().sendMessage(
"response", "ng", "can't twit " + TWITTER_ID);
}
}
}
@Override
public void shutdown() {
// TODO Auto-generated method stub
}
}
Room Moduleをdeployする
前回と同じようにAntツールを使ってdeployします。deploy後は、stopserver.bat(.sh)、startserver.bat(.sh)を実行してUnion Serverを再起動しておきましょう。
簡単なClientを作ってみる
下記サンプルが動作するためには、localhostに先ほどのRoom Moduleを定義したUnion Serverが起動している必要があります。
twitボタンをクリックすると、先ほど設定したtwitterアカウントで入力したメッセージを呟きます。
Room Moduleの指定
2つの方法があります。
Reactorで指定する方法
Reactorで指定することで、任意のRoomに任意のRoom Moduleを割り当てることが可能となります。 具体的には以下のように、RoomModulesインスタンスを生成して、割り当てたいRoom Moduleのクラスを指定します。
// Room モジュールを指定します。
var modules:RoomModules = new RoomModules();
modules.addModule(
"com.asmple.server.union.module.room.TwitModuleSample",
RoomModuleType.CLASS);
// Room モジュールを指定しながらRoomを生成します。
_room = _reactor.getRoomManager().createRoom(
"twitRoom", null, null, modules
);
Union Serverのunion.xmlで指定する方法
Room Moduleを割り当てたいRoomが固定の場合、Union Serverのunion.xmlで指定すると良いです。今回のRoom ModuleをtwitRoomに割り当てる場合にはunion.xmlに以下のようなセクションを追加します。この例では、twitRoomというRoom IDのRoomにcom.asmple.server.union.module.room.TwitModuleSampleというRoom Moduleが割り当てられます。
twitRoom
com.asmple.server.union.module.room.TwitModuleSample
まとめ
今回は、Module Messageに注目してRoom Moduleを作成してみました。Server側のイベント発生のタイミングで他にも色々なModuleを作成する事が出来ます。Union ServerのModuleを作成すると、よりリッチなマルチユーザアプリケーションを作成する事が出来ます。
今後も、バージョンが更新されるたびに、Union Platformの調査を続けて行きたいと思います。これからもUnionのバージョンアップが楽しみです。