既存Javaプログラム向け
分散化支援システムの開発
東京工業大学大学院 情報理工学研究科
数理計算科学専攻 千葉研究室所属
03M37200 須永 豊
修士論文発表会
1
既存ソフトウェアの分散化
ターゲットとするのは機能分散
非分散な既存ソフトウェア
分散用に開発しなおすのはコストがかかる
再利用したいモジュール
分散アプリケーション開発用のモジュールは不向き
EJB,Servlet,ORB・・・
フレームワークに応じた大幅なプログラムの変更
煩雑な修正作業を自動化するツール
Addistant,J-Orchestra etc
現実的なソフトウェアを分散化出来るか?
2
実例の紹介(ARMSoftware)
ARMSoftware[Arita,M. ‘03]
化学物質の構造式・反応式・パスウェ
イを辿るためのJavaプログラム
2003年度未踏ソフトウェア事業
2万行強の中規模サイズアプリケーショ
ン
スタンドアロンなプログラム
利用者はホームページからダウンロードし、
自分のマシン上で利用
このプログラムをサーバ・クライアント型
のアプリケーションに変えて欲しい!
修士論文発表会
3
ARMSoftwareの分散化
開発者からの要求
特定の機能のみをサーバで動かしたい
DBからパスウェイを探索する機能
DBから構造式の画像を取得する機能 etc
プログラムの変更
サーバ側で動かすために特定クラスをリモート化
JavaRMIの仕様に合わせてリモートクラス化
呼び出し元の変更
リモート化によって生じる
アプリケーションセマンティクスの変更
アプリケーション毎に異なる処理
修士論文発表会
典型的な
分散化のための
リファクタリング
従来ツールで
サポートが可能
4
アプリケーションセマンティクスの変更
(メソッド単位での遠隔配置)
あるクラスの特定メソッドのみ遠隔配置
分散化に適していないモジュール分割
従来システムではサポートされていない
class Doc extends…{
public short urlIndex;
public Vector urlList;
public Object[] search (…){
/*サーバ側で処理させたい。
フィールド等にアクセスし、
outputData()の処理内容に影響
する*/
}
public void output(…) {
//クライアント側で処理
}
…..
}
Docオブジェクト
Docオブジェクト
Docオブジェクト
urlList
urlList
同期処理
urlIndex
urlIndex
output()
search()
………
Client
Server
5
アプリケーションセマンティクスの変更
(マルチユーザ化)
Server
複数ユーザで利用可能に
クライアント毎にセッションを
用意
セッションの実装方法は
様々
リストを使ったり、デザイ
ンパターンを用いたり
用意したいセッション処理
も異なる
スタンドアロンな
プログラム
Client C
Client
Client B
修士論文発表会
6
従来の自動分散化システムでは困難な点
アプリケーションセマンティクスの変更を伴う
分散化
分散化に適さないモジュール分割のプログラム
遠隔配置以外の処理も必要
機能拡張等のプログラムの構造を変える処理
遠隔配置を施す以外のプログラム変換は行わない
セッション処理の付加等
しかし、現実的なソフトウェアには必要
典型的な自動化では対応できない箇所を
サポートできるツールが必要
修士論文発表会
7
分散化支援ツールJacrossの提案
分散に関する記述力を強化した分散支援ツール
XMLによる、より詳細な分散配置の指定
Aspect指向技術を応用し、プログラムの構造を変化
ソースコードに変更は加えない
分散処理用Aspectとしてモジュール化
遠隔参照の実現等の典型的な分散化処理は自動化
バイトコード変換により実現
分散
ポリシー
元プログラム
・スタンドアロン
・シングルユーザ用
分散
処理用
Aspect
Jacrossで分散化
修士論文発表会
生成プログラム
・サーバクライアント
・マルチユーザ用
8
典型的な自動分散化処理
対象クラスのタイプに応じた配置指定
プロキシマスタ方式に基づき、クラスを遠隔参照出来る用に変換
Replace
対象クラスのコードが可変である場合に適用可能
元クラスを中身がプロキシ化されたもので置換
Rename
参照側クラスのコードが可変である場合に適用可能
<クラス名>+_Proxyでプロキシクラスを生成
参照側クラス内の対象クラスへの参照をプロキシに変更
Subclass
対象クラスを遠隔とローカルの2箇所で利用したい場合
対象クラスのサブクラスとしてプロキシを実装
指定クラス内からの参照のみをサブクラス化されたプロキシへと
変更
修士論文発表会
9
permethod
メソッド単位で分散化処理
メソッドを指定し、対象メソッ
ドのみを遠隔配置
各方針と併用
d.output();
ローカルと遠隔でそれぞれ
1つずつオブジェクトを生成
遠隔メソッド呼び出し時のみ
遠隔オブジェクトを利用
遠隔とローカルのオブジェク
トの反映が必要
自動化すべきではない箇
所(実装は様々)
Client
Doc d
= new Doc();
Object ret
= d.search();
R
M
I
Server
修士論文発表会
Doc
index
output()
同
期
化
等
の
処
理
が
必
要
Doc
index
search()
10
分散処理用Aspect
ソースコードに変更は加えない
Inter-type Declaration
元プログラムにフィールドとメソッドを追加する。
インタセプタ
元プログラムの制御フローを変える
利用者の指定した箇所で割り込み処理を行う。
XMLを利用したバインド
Inter-type Declarationとインタセプタをバイン
ドする為の記述は分散ポリシー内で行う
修士論文発表会
11
Inter-type Declaration
フィールドやメソッドを追加する
Javaで定義
追加されたメソッドもリモート化の対象に
追加先を予測して指示
元クラス
class Doc…{
……
public Object foo(..) {
……
}
……
}
public class DocInterType {
public Vector indexlist;
public Vector getList() {
……
}
……
}
修士論文発表会
Inter-type Declaration
生成クラス
public class Doc…{
public Vector indexlist;
public Vector getList() {
……
}
public Object foo(..) {
……
}
……
}
12
インタセプタ
制御フローを変える為のプログラ
ム
プログラムの指定した箇所で割
り込み処理を行う
インタセプタはJavaで定義
JacrossInterceptor
インタセプタは、このクラスを継
承し、全てのメソッドはObject
型の戻り値とInvocation型の
引数を持つ → 制約
proceed() : 割り込み元の操
作を実行するメソッド
Invocation
元プログラム
getThis(), getTarget() 等:
割り込み元のコンテクストを取得
するメソッドを提供
修士論文発表会
Doc d = new Doc(..);
……
割り込み箇所
(pointcut)
d.setIndex(..);
….
class DocInterceptor…{
…….
Object setLog(Invocation i) {
System.out.println(“before”);
Object ret = proceed(i);
System.out.println(“after”);
return ret;
}
……
}
イ
ン
タ
セ
プ
タ
で
処
理
インタセプタ
ポリシー記述
XMLで記述
配置方針を選択
遠隔配置の方針を指定
<import>タグ
分散処理用Aspectのバインド
Inter-type Declarationの指定と
追加先<inter-type>タグ
pointcutの指定とインタセプタの指定
<inteceptor>タグetc
利用できるpointcut指定子は5つ
call
execution
set/get
new
メソッドの呼び出し
メソッドの実行
フィールドの読み出し/書き出し
インスタンス生成
<policy>
<import proxy=“replace-permethod” host=“server1”>
armview.util.Doc.search(..)@armview.util.BasicDoc
armview.util.Doc.remotesetIndex(..)
</import>
<import proxy=“replace” host = “server2”>
……
</import>
<inter-type name=“DocInterType”
bind-to=“armview.util.*Doc” />
<interceptor classname=“DocInterceptor”>
<intercept name=“setIndex”
expression=“execution(armview.util.*.setIndex(..))”/>
<intercept name=…/>
<binding intercept-name=“synchroIndex”
to=“setIndex”/>
<binding …/>
</interceptor>
……
</policy>
修士論文発表会
14
ARMSoftwareの例
メソッド単位での分散化処理
Inter-type Declaration
public class DocInterType {
int index;
public void remotesetIndex(int index) {
this.index = index;
}
……
}
class Doc…{
public int index;
……
public Object search(..) {
……
}
public void setIndex(..){
……
}
public void output(..) {
……
}
}
対象クラス
pointcut
要
素
の
追
加
修士論文発表会
Doc d = new Doc(..);
……
……
d.setIndex(..);
……
……
Objec ret
= d.search(..)
d.output();
元プログラム
遠
隔
参
照
の
自
動
化
class DocInterceptor…{
…….
Object synchIndex(Invocation i) {
Object ret = proceed(i);
Doc d = (Doc) i.getTarget();
d.remotesetIndex(d.index);
return;
}
……
}
インタセプタ
15
ARMSoftwareの例
機能拡張(セッション処理)
Inter-type Declaration
public class DocInterType {
public static Vector namelist;
public static void setUName (int id,String name) {
indexlist.set(id,name);
}
public static String getUName(int id) {
……
}
要
素
の
追
加
class Doc…{
public static String name;
……
public Object search(..) {
……
}
public void output(..) {
……
}
}
サーバ側元クラス
pointcut
pointcut
Doc d = new Doc(..);
……
……
Objec ret
= d.search(..)
d.output();
……
クライアント側
元プログラム
遠
隔
参
照
の
自
動
化
class DocInterceptor…{
…….
Object setSession(Invocation i) {
Doc.name = getUName(id);
Object ret = proceed(i);
Doc.setUName(id,Doc.name);
}
Object sendCurrentID(Invocation i) {
……
}
……
}
インタセプタ
16
コード数の比較
ARMSoftwareの変換を通じた比較
オリジナルとの差分(変更が必要なコード数、クラス数の比較)
オリジナル=元プログラム
手動=手動による分散化処理
Jacross=Jacrossによる分散化処理
分散ポリシーも含む
変更が必要なクラス数 変更に必要な行数
オリジナル⇔手動
33
951
オリジナル⇔Jacross
5
349
割合(Jacross/手動)
15%
36%
修士論文発表会
17
関連研究
自動分散化システム
Addistant[Tatsubori’01]
J-Orchestra[Tilevich’02]
アスペクト指向言語
AspectJ[Kiczales’01]
AspectWerkz
JBossAOP
修士論文発表会
18
まとめ
分散化処理は定型的な作業ではない
アプリケーションに依存した処理が必要
典型的ではない分散化を支援するシステムJacrossの提案
アプリケーションセマンティクスの変更を伴う分散化
より現実的なアプリケーションに対応
利用者のニーズに応じた分散化処理の実現
分散処理に伴う機能拡張が容易に
典型的な作業→自動化
アプリケーションに依存→アスペクトでサポート
課題
分散処理用Aspectの工夫
統合したシステム
pointcut指定子の増加
修士論文発表会
19
© Copyright 2026 ExpyDoc