外野から攻めてみる†JXTAについて調べているときに、IBMの記事を見つけました。JXTAの概念、JXTA2に採用された新しいテクノロジーなどが、分かりやすく紹介されています。 この記事の中で、サイレントスタートのための仕組みが解説されています。JXTAのプログラムを起動するときには、初回にかなり沢山の設定ファイルをユーザーに入力してもらう必要がありました。‥‥が、エンドユーザーに提供するアプリケーションでそんなことできるわけありません。とりあえず起動してもなんとなく動いてる状態が理想なのです。 複雑な設定処理を回避するために、この記事では初期設定ファイルを自動的に作成するサイレントスタートプログラムのサンプルを掲載しています。記事によると、JXTA SHELLを起動するためのスターターのようです。 ‥‥しかしこれ、最新のJXTA APIではさっぱり動きません(ーー;。初期設定関係のAPIがごっそり変更になっていまして(記事でもそのようなことが書いています)、古いコードのこの記事は全然参考にならないのですよねぇ~。 ということで、APIのソースコードをデバッグでステップ実行しながら追いかけた結果、とりあえず今はこうすればいい‥‥らしい、というものをでっち上げました。以下、書き換えたプログラムコードです。 初期設定の自動生成サンプル†001: /*
002: * ShellStarter.java
003: *
004: * Copyright 2004 どっとステーション駅長
005: */
006:
007: package com.ibm.devworks.jxta2.shell;
008:
009: import java.io.File;
010: import java.net.URI;
011: import java.net.URISyntaxException;
012:
013: import net.jxta.exception.ConfiguratorException;
014: import net.jxta.ext.config.Configurator;
015: import net.jxta.ext.config.Profile;
016: import net.jxta.impl.peergroup.Boot;
017:
018: /**
019: * 自動構成機能を付加したシェルスターター。
020: *
021: * @author どっとステーション駅長
022: * @see <a
023: * href="http://www-6.ibm.com/jp/developerworks/java/040514/j_j-jxta2.html">IBM
024: * DevloperWorks記事 </a>
025: * @see <a
026: * href="http://ssp.shillest.net/specwiki/pukiwiki.php?%B1%D8%C4%B9%2FJXTA%CA%D9%B6%AF%B2%F1">開発メモ
027: * </a>
028: */
029: public class ShellStarter {
030: private static final String JXTA_HOME_PROP = "JXTA_HOME";
031: private static final String TLS_PRINCIPAL_PROP = "net.jxta.tls.principal";
032: private static final String TLS_PASSWORD_PROP = "net.jxta.tls.password";
033: private static final String ADDR_SEP = ":";
034: private static final String PORT_PRE = "97";
035: private static final String PORT_POST_TCP = "1";
036: private static final String PORT_POST_HTTP = "0";
037: private static final String TCP_PRE = "tcp://";
038: private static final String USER_NAME = "dwuser";
039: private static final String USER_PASS = "dwuser12345";
040:
041:
042: public ShellStarter() {
043: }
044:
045: /**
046: * JXTAの構成を自動作成します。
047: *
048: * @param pearName
049: * このpearの名前。
050: * @param tcpAddress
051: * @param tcpPort
052: * @param httpPort
053: * @param rdvNode
054: * @param isRdv
055: */
056: public void configure(String pearName, String tcpAddress, int tcpPort,
057: int httpPort, String rdvNode, boolean isRdv) throws ConfiguratorException {
058: // 環境変数設定
059: String JXTA_HOME =".jxtashell_" +pearName +File.separator;
060: System.setProperty(JXTA_HOME_PROP, JXTA_HOME); // JXTA_HOME JXTA設定ファイルの保管場所
061: System.setProperty(TLS_PRINCIPAL_PROP, USER_NAME); // ユーザー名
062: System.setProperty(TLS_PASSWORD_PROP, USER_PASS); // パスワード
063:
064: // 設定が既に存在すれば何もせずに終了
065: File jxtaHome =new File(JXTA_HOME);
066: Configurator.setHome(jxtaHome);
067: System.out.println("JXTAHOME:" +jxtaHome);
068: System.out.println("JXTAHOME:isDirectory:" +jxtaHome.isDirectory());
069: System.out.println("JXTAHOME:exists:" +jxtaHome.exists());
070: if(jxtaHome.exists()) return;
071:
072: // JXTA設定オブジェクトの作成
073: Configurator conf;
074: if (isRdv){
075: // ランデブーピアのデフォルト定義
076: conf = new Configurator(Profile.RENDEZVOUS);
077: }
078: else{
079: // エッジピアのデフォルト定義
080: conf = new Configurator(Profile.EDGE);
081: }
082:
083: // ピア名・ユーザー名・パスワードを設定
084: conf.setName(pearName);
085: conf.setDescription("ShellStarter-Sample");
086: conf.setSecurity(USER_NAME, USER_PASS);
087:
088: // 初期ランデブーノードの登録
089: int rdvNodeNum = Integer.parseInt(rdvNode);
090: if (rdvNodeNum < 10) {
091: try {
092: URI u = new URI(TCP_PRE + tcpAddress + ADDR_SEP + PORT_PRE + rdvNode
093: + PORT_POST_TCP);
094: conf.addRendezVous(u);
095: } catch (URISyntaxException e) {
096: throw new ConfiguratorException(e);
097: }
098: }
099:
100: // TODO マルチキャストを無効にする
101:
102: // 設定の保管
103: conf.save();
104: }
105:
106: public static void main(String[] args) throws Exception {
107: ShellStarter starter = new ShellStarter();
108: boolean isRdv = false;
109:
110: // 引数解析
111: if ((args.length == 5) && (args[4].equalsIgnoreCase("rdv")))
112: isRdv = true;
113: else if (args.length != 5) {
114: System.out
115: .println("Usage: ShellStarter <peer name> <ip address>"
116: +" <node number> <rdv node number> <rdv | edge>");
117: System.exit(1);
118: }
119:
120: // JXTA構成処理を呼び出す
121: int tcpPort = Integer.parseInt(PORT_PRE + args[2] + PORT_POST_TCP);
122: int httpPort = Integer.parseInt(PORT_PRE + args[2] + PORT_POST_HTTP);
123: String pearName = args[0];
124: String tcpAddress = args[1];
125: String rdvNode = args[3];
126: starter.configure(pearName, tcpAddress, tcpPort, httpPort, rdvNode, isRdv);
127:
128: // シェルの起動
129: Boot.main(args);
130: }
131:
132: }
初期化処理の概要†えーと、オリジナルソースの影響をそこかしこに受けている初期化ルーチンです。本当はもうちょっとリファクタリングして、初期化プロセスだけを抜き出すべきなのですが、面倒なので今はこのままで(^^; 初期化処理は以下のパートに分かれます。
APIと環境変数両方使って、設定ファイルの場所を通知してやらないといけないのがなんとなく納得できないのですが(ーー;、とりあえずここまで修正することで、サイレントスタートが可能になりました。jxta.org.impl.*なオブジェクト(API以外の部分)も、シェル本体であるBootを除いて排除できています。 設定情報の作成で重要なのは、定義作成クラスであるnet.jxta.ext.config.Configuratorと、主要な定義を保持しているnet.jxta.ext.config.Profileです。Profileから基本的な定義を選択した上でConfiguratorオブジェクトを作成し、更に足りない情報を設定していく流れですね。 唯一元IBMの記事にある「マルチキャストの無効化」の方法が掴めませんでしたが、複数同時起動とその通信はなんとなく出来ているっぽいので調査は保留しました。誰か知っている人はこっそり教えてください(^^; さて次は†「ハローワールドはしない」と言いましたが、そう言いつつやっぱりやります(^^;。ただ、JXTAらしく仮想ネットワークを経由したものになります。とゆーかやっぱりゴーストにしゃべらせたいよね♪さてさて‥‥。 参考URL†http://www-6.ibm.com/jp/developerworks/java/040514/j_j-jxta2.html コメント欄†作業用† |