とにかくめんどくさそーなGlobus Toolkit3。でもアプリケーション開発だけなら、要するにAxisなんだ!ということはやはり、NetBeans上で作成したりデプロイしたりクライアントを起動したりできるのか?やってみました。ホントにこれで分散環境行けるのかわからないけど!だからはっきり「これがグリッド環境だ!」と断言できるまで見出しもハテナマークつきデス。
/クライアントの実行/GT3のAntスクリプトを見極めろ!/まず物理的に配置/Hey.wsdd/生クラスのデプロイはダメなようだ/Heyインターフェイスの実装/WSDL2Javaでスタブファイル群を作る/DecorateWSDL/J2WGUIのGT3版/あなたと呼べばあなたと答えるインターフェイス/CounterClientを実行する/CreateServiceを実行する/クライアントアプリのコピー/ogsaサービス起動/NBにマウントするもの/外部TomcatをNBに配備/他のTomcatに憑依する/guide系サービスをデプロイしておく(動作確認のため)/GT3Coreのインストール/参考文献/背景/
さあーて、クライアントの実行だ。もうどこでもいいよ作るのは。とりあえずogsaworks/gt3clientというディレクトリを作って、これをマウントした。パッケージはheyclient。

中身はこんなもんだ。
package heyclient;
import hey.HeyServiceLocator;
import hey.HeyPortType;
import java.net.URL;
public class HeyClient {
public static void main(String[] args){
try{
String name=args[1];
URL GSH= new java.net.URL(args[0]);
HeyServiceLocator heyService=new HeyServiceLocator();
HeyPortType hey= heyService.getHeyService(GSH);
String response=hey.heyhey(name);
System.out.println(response);
}
catch(Exception e){
System.out.println("An Error Occurred");
e.printStackTrace();
}
}
}
で、実行。実行用ディレクトリはどこでもいいよモー(なにひとりで自暴自棄なってんだヨのに子。疲れてんのか家事もしないのに)。ただ引数は

え、いや。localhostってしないで、アドレス直接書いちゃったの。だってグリッドコンピューティングって言ってんのにローカルクライアントじゃチョとカッチョ悪いじゃない。実際はローカルクライアントなんだけどホントに。ここでは、サービスのURLと、文字列nameとしてNonikoを引数にした。
答えは、

おー。いちおうはじめての俺グリッドサービスができたらしい。でも何がどうグリッドなのかぜんぜんわかんなーい。チュートリアルにも「このあとリアルなグリッドサービスを教えます」と書いてあるし。これからなんだ。そのリアルなグリッドサービスというものは、NB上に載せられるのか!?のに子はリアルなグリッドサービスというモノを理解できるようになるのか!?でもおそらくだいぶページ重くなっちゃったから別のページだネこの次は。
2003年12月05日
さて、サービスの登録は・・・GT3の蟻さんはそこんとこどのようにお考えなんだろうか。そろそろ、このめんどくさそうなスクリプトを読まなければならなそうだ。とにかく、サービスに登録するところだけは・・・
けどさー。蟻がでかくなると、あっちこっちに子蟻が出てきてめえんどくさいんだよな。build.xmlを見るとbuild-packages.xmlを見ろと言われ、ターゲットdeployGarを見ればdeployServerを見ろと言われ・・・けど、たらい回しではないんだな。系統的に細分化された項目に降りていくわけだから、そこはあんまりゴネるなヨのに子。とにかくようやくbuild-packages.xmlのこの辺に注目すればいいことがわかった。
<target name="deployServer" depends="testServerDeployAvailable"
if="serverDeploy.available">
<echo message="deploying server config..."/>
<java classname="org.apache.axis.utils.Admin" classpathref="classpath"
fork="true" failonerror="true">
<arg value="server"/>
<arg value="${gar.dest}/server-deploy.wsdd"/>
</java>
</target>
つまり、サーバにデプロイするには、
org.apache.axis.utils.Adminクラスを実行。
引数は、 server と、あと、Hey.wsddのパスだ。
Axisのときに使ったAdminClientと違って、こっちのAdminのほうは引数によってサービスをデプロったりクライアントをデプロったり、よりきめ細かな設定ができる・・・のかな。わかんないけど。
さて、このorg.apache.axis.utils.Adminだが、実行ディレクトリはserver-config.wsddのある場所でないとダメっぽいようだ。すなわち、/export/home/noniko/tomcat4124/webapps/ogsa/WEB-INFである。他の作業の実行ディレクトリから、ひとつかけ離れている。このときだけわざわざ実行ディレクトリを変えて、他の作業に戻ったときにまた直す、なんてめんどくさい・・・
そんなあなたに(わたしだヨ)よい方法。NetBeansでPersonal Profileをやったときのように、マイ外部実行をひとつ、新規に作ればいいのだ。名前はexeoncat。この実行ディレクトリを、
/export/home/noniko/tomcat4124/webapps/ogsa/WEB-INF
にする。 あとは、こんなふうにしてやればよい。

これで右クリック実行だヨ。すると

と出る。だが安心してはいけない。わたしの使い方があまりにも変則的だからだと思うが、設定がよくないと、このメッセージは出ても実際server-config.wsddに登録されてない場合もある。(Axisの開発者さんが予期しない使い方をしてるのかわたしは?威張っていいのかそれは?)ちゃんと確かめよう。
/export/home/noniko/tomcat4124/webapps/ogsa/WEB-INF/server-config.wsddを見る。
<service name="hey/HeyService" provider="java:RPC">
<parameter name="allowedMethod" value="*"/>
<parameter name="className" value="hey.impl.HeyImpl"/>
</service>
おお、あったあった。これでデプロイ完了!tomcat4124を起動する。
2003年12月05日
では作ったjarファイルとwsddファイルを、借りてきた猫/export/home/noniko/tomcat4124に配置しよう。こんなふうになる。
Hey.wsddはWEB-INF直下に、GT3の他のwsddファイルと一緒に配置してやると、キタナイかも知れないが確実にうまくは行くようだ。赤丸のついたのが今配置したヤツ。そして緑の丸のついたserver-config.wsddが、サービスの登録先だ。
2003年12月05日
Hey.wsddは最終的にはtomcat/webapps/ogsa/WEB-INF下になければならないファイルだ。だが作っておいてheyパッケージ内に置いておけばディレクトリのコピーなどのときに紛失しないですむだろう、ということ。
内容は、こんなもんだ。
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="hey/HeyService" provider="java:RPC">
<parameter name="className" value="hey.impl.HeyImpl"/>
<parameter name="allowedMethod" value="*"/>
</service>
</deployment>
2003年12月05日
さて、あとはこれにwsddファイルをつけてServiceに登録して起動、ということになるのだが、チュートリアルではGT3に用意されたAntでant deploy
とやればヨロシと書いてある。だがここではあえて、ひとつひとつ手でやっていきたいと思う。そのほうが心がこもっている、じゃないって。Antスクリプト読むほうがめんどいんだもんだって。
だが、 以前Axisでやったように、Tomcatのwebapps/ogsa/WEB-INF/classes内にクラスファイルを置いて、という方法ではなんかできないみたいだ。jarで固めてWEB-INF/lib内に置く必要があるみたい。この辺よくわかんないけどとにかく、できる方法でやっておこう。
jarで固めるといやあNetBeansのJAR自動生成ツールで、コレは特記する必要もないくらいだ。たぶん。hey.implパッケージのものをhey.jar,
heyパッケージのものをhey-stub.jarという名前で固める。MANIFESTはおまかせで、主クラスの設定などはしなーい。NetBeansだと「Jarレシピ」を生成して、コンパイルにより実際のjarファイルを作ることになる。
ちなみに、図中のファイルHey.wsddが、前々節で「余計なファイルが見えているので消した」というヤツだ。もちろん作らなければならないファイルなんだが正式にはここにあるべきではない・・・
2003年12月05日
これでようやくHeyインターフェイスのheyheyメソッドを実装することになる。hey.impl.HeyImplというクラスだ。
package hey.impl;
import org.globus.ogsa.impl.ogsi.GridServiceImpl;
import hey.*;
import java.rmi.RemoteException;
public class HeyImpl extends GridServiceImpl implements HeyPortType {
/** Creates a new instance of HeyImpl */
public HeyImpl() {
super("Hey Hey");
}
public java.lang.String heyhey(java.lang.String name) throws java.rmi.RemoteException
{
return "Hey "+ name;
}
}
多くの方が予想されたとおり、名前を入力したらHeyと呼びかけるだけのことだ。

2003年12月05日
デコレートされたらしいHeyService.wsdlから、WSDL2Javaでスタブファイル群を作る。こんなものがズラズラっと、できた。

スクリーンショットに自分で作った余計なファイルが一個混じってたので消してありまして、ゆえにちょっと不格好。
2003年12月05日
ここでGT3特有のツールを初めて使うことになる。WSDLファイルにGT3特有の記述を加えるためのものなようだ。そのorg.globus.ogsa.tools.wsdl.DecorateWSDLを実行するためにまた受け皿を作る。マウントしているgt3serverディレクトリ上にまたカラのディレクトリを作る。
gt3server/orgまでは作ってあるので、その下に
gt3server/org/globus
gt3server/org/globus/ogsa
gt3server/org/globus/ogsa/tools
gt3server/org/globus/ogsa/tools/wsdl
まで作る。
次に、DecorateWSDL.javaファイルを持ってくる。それは
core-0.4-src/impl/java/tools/org/globus/ogsa/tools/wsdl/
にある。探すのがめんどっちいが、最近は慣れてきた。それを今作ったgt3server/org/globus/ogsa/tools/wsdlにコピーする。
これを実行するには、ogsi_bindings.wsdlというファイルが必要らしい。それは
core-0.4-src/impl/java/schema/ogsi/
にある。だが、試してみたことはないがなーんか他のファイル群と依存性が強そうなので、上記ogsiディレクトリをそのまんま
gt3server/schema/ogsi
というカタチでコピーしてしまった。こんなフー。

ogsiディレクトリにはたくさんファイルがあるが、その中にogsi_bindings.wsdlが入っているのを確かめたところ。
org.globus.ogsa.tools.wsdl.DecorateWSDL の実行場所はやっぱり/export/home/noniko/ogsaworks/gt3server にする (なってるかも知れないが確認する)。実行時の引数を指定する。

schema/ogsi/ogsi_bindings.wsdl は相対パスだ。右クリック実行すると、こんなメッセージが出る。

さて、HeyService.wsdlに何が起こったか。実行する前にとったバックアップファイルと、じっと見比べてみたが、どーも、最後に一行、こんなものが付け足されているだけのようにしかわたしには思えない。
<wsdl:port binding="gridservicesoapbinding:GridServiceSOAPBinding"
name="GridServiceSOAPBindingPort">
<wsdlsoap:address location="http://localhost:8080/ogsa/services/hey/HeyService"/>
</wsdl:port>
2003年12月05日
チュートリアルによれば、インターフェイスを作ったら、実装する前にWSDLファイルを作れとある。org.apache.axis.wsdl.Java2WSDLを使うという。今のケースではこんなふうにすることになる。
java org.apache.axis.wsdl.Java2WSDL \
-P HeyPortType -S HeyService \
-l http://localhost/ogsa/services/hey/HeyService \
-n urn:hey hey.impl.Hey \
チュートリアルのお手本によると、オプション-nに対する引数は
-n http://hey/Hey
みたいに書くべき、なのかも知れないが、それで実行したらそんなURLはねえヨとかいうエラーになった。そこで以前やったとおり
urn:(属させたいパッケージ名)
にした。名前空間てのはどうもよくわからん。いずれ決着をつけねばなるまい。
以前作ったJ2WGUIと引数が違うので作り直す。ソースコードはJ2WGUIと一緒のページで御紹介。ちなみに、オプションフラグと値の間に空白を入れるとか入れないとかいうゴタゴタは今度はなかった。それも不思議な話だ。とりあえず、実行するとこんな感じになる。

あ、そーいや、Sol9のデスクトップの色を変えたのヨ。なんか気分が変わっていい感じ〜。女コドモはこれだから困る。
さて、問題はこのツールをどこに配置するかである。
今マウントしているogsaworks/gt3serverディレクトリの下に、自分で
gt3server/org
gt3server/org/apache
gt3server/org/apache/axis
gt3server/org/apache/axis/wsdl
とディレクトリを作る。パッケージとしてはorg.apache.axis.wsdlを作ったわけだ。そこに入れてやる。

同様あとで使うツールの入ったorg.apache.axis.utilsも見えている。また、やはりあとで使うWSDL2Javaも、Axisで提供されているソースに何も手を加えず、コピーしたところである。
このJ2WGUI_Gの実行ディレクトリを、/export/home/noniko/ogsaworks/gt3server に指定する。
もしかして、実行ディレクトリの指定の仕方を報告してなかったかも知れない。簡単に解説する。

汚くてゴメンナサーイ。だってウィンドウでかいわりに字ちっちゃいんだもん。エクスプローラウィンドウからJ2WGUI_Gを選択して、プロパティを出す。「実行」の「外部実行」のさらにプロパティを出す。「上級」タブに移動して、「作業用ディレクトリ」を入力するという具合。ディレクトリは参照させてくれるから込み入っててもダイジョブ。
で、実行すると、HeyService.wsdlができているはず。「gt3server」ノードを右クリックして「フォルダを再表示」を選択しないと、たぶん出てこない。

2003年12月05日
それでは俺サービスを作ってみよう。Globusのサイトには非常にわかりやすいProgrammer's Tutorialがある。これに従ってやっていくのがよろしかろう。でもコードの中身は違うっていうかもっと簡単にしました。いわく、「あなたと呼べばあなたと答えるどこがどうグリッドなのかまだ全然わからないぞサービス」!
そのために、いままでの単純なディレクトリ構造をちょっと変える。
今まで使っていた/export/home/noniko/ogsaworksディレクトリを一度マウント解除する。
これを、ogsaworksbak という名前に変えちゃう。
もう一回、/export/home/noniko/ogsaworks ディレクトリを新規に作成する。
さらに、ogsaworks/gt3server ディレクトリを作成する。
そうして、このgt3serverディレクトリをNetBeansにマウントする。
そしたら、Javaパッケージhey、さらにパッケージhey.impl を作成し、そこにHeyというインターフェイスを作る。
package server.hey.impl;
public interface Hey {
public String heyhey(String name);
}
インターフェイスなんでメソッドの中身も書かないが、どうせNonikoと入力すればHey Nonikoと出力するようなサービスを作ろうってんだろと見抜かれているに違いない。このディレクトリ構造はこんな感じになっている。

2003年12月04日
では張り切って、CounterClientを実行しましょう。これも引数をこんな風に編集。
右クリ実行!

うきゃきゃきゃ。動作確認成功。
うーんとね。そう!ここまで来ると好みの問題。マウントしてソースフォルダから該当の実行プログラムを探してきてコピーして引数ウィンドウを出して・・・という操作がいいか、コマンドラインでながーいコマンドを打つのがいいか!後者だってスクリプトファイル書いたり、環境変数設定したりすれば、極限まで操作を簡略化できるハズだ。わたしは結局NetBeansをどこまで使い込めるか挑戦してるだけなのかも知れない。
2003年11月19日
まず、WebサービスCounterFactoryServiceに対して、CreateServiceを実行する必要がある。そこで下の図の右クリックとなるわけだが、引数を指定しなきゃいけない。コマンドラインなら、
java org.globus.ogsa.client.CreateService http://localhost:8080/ogsa/services/guide/counter/CounterFactoryService calc
とやるところだ。こうしたなんがーい引数の指定も、実はおっきい画面でラクラクできることが最近わかった。
エクスプローラ上でCreateService.javaのアイコンをポチっとやって、そのプロパティを見る。「実行」タブウィンドウを出して「引数」の欄をポチって、大きな引数編集画面が出てくるのだ。そこに書いてやればいい。

これで右クリック実行!しばし待たされるが・・・・

ぶっしゃっしゃっしゃー。これでogsaサービスは、元気に動いていることがわかったゾ!
2003年11月19日
ではguide系のサービスにクライアントアクセスしてみよう。そのために、ogsa-3.2.0ディレクトリにある該当クライアントアプリをNetBeansのogsaworksディレクトリに持ってくることにする。ただしどこから持ってくるかがちょっとコツで、コレは当然ながらJAVA Developer10月号の「GT3グリッドコンピューティング入門」を読みつつ、試行錯誤によって得られた経験だ。
その前に、もらってきた「core source」ことgt3.0.2-core-src.tar.gzを解凍する。core-0.4-srcというディレクトリになる。もちっとGT3のものである的名前をつけてほしくは、あった。
とにかく、頼みのGT3ソースファイルは、core-0.4-src/impl/java/以下にある。
まず、ogsaworks/org/globus/ogsa というディレクトリ構造を作っておく。
ogsaworks/org/globus/ogsa/client ディレクトリを作る。
core-0.4-src/imple/java/src/org/globus/ogsa/client/CreateService.java を上記ディレクトリにコピーする。
core-0.4-src/imple/java/guide/src/org/globus/ogsa/guide ディレクトリを全部、
ogsaworks/org/globus/ogsa/ディレクトリに、だーとコピーする。
図示すると、こんな感じ。
ちょっと見えにくいかなー。
すると、NetBeansのファイルエクスプローラ上ではこんな風に見えるはず。実行するのは、CreateService とCounterClientだ。org.globus.ogsa.guide.implパッケージの他のクラスは、依存するかもわからないと思って全部持って来ちゃった。あくまでこっちはサンプルクラスなので、動作確認が出来たら消しちゃってもいんだし。

2003年11月19日
ogsaサービスの起動には、 「エクスプローラ[実行時]」の「Tomcat」ノードを開ける。猫が二匹いることが確認できる。

このうち、tomcat4124のほうを右クリックして「サーバを起動」を選ぶ。残念ながらここではどんなサービスがデプロイされているかはコンソールに現れない。あと、おバグさんで、上の[実行されていない]は永遠に[実行されている]にはならないが、他の実行中のプロセスを表示するウィンドウ(いくつかある)にはちゃんとこれが表示されているので、軽く流す。
2003年11月19日
以下のものをNetBeansにマウントする。
1)tomcat4124/webapps/ogsa をマウントする。これは同時にたくさんのクラスライブラリを読み込むので結構時間がかかる。NetBeansは自動的にこれがWebモジュールであることを判定してくれるようだ。
2)ワーキングディレクトリとして、/export/home/noniko/ogsaworksというのを作って、これをマウントする。
3)あと、ogsa-3.0.2/lib内にある.jarファイルもマウントしないといかんようだ。一応全部マウントしてしまった。1)のマウントによりこれらのうちかなりのものがマウントされてくれるのだが、たとえばjaxrpc.jarなどはマウントされないので、クライアントアプリケーションの実行時に、クラスが見つからないエラーが出てしまった。同じ名前のアーカイブを重複してマウントしても、NBは別に文句を言わないでくれるようだ。今のところまだライブラリ同士のバッティングなども見つかっていない。もし今後エラーが出るようならまた報告します。(2004年12月25日修正)
さて、これをNetBeansにセットアップする。「エクスプローラ[実行時]」の、「Tomcat」ノードをクリックして「Tomcatインストールを追加」を出す。

すると、設定ウィンドウが現れる。ここではホームもベースも同じにしてしまった。いずれも「ブラウズ」ボタンを押すとファイルチューザからチョク指定できるので、tomcat4124ディレクトリを探して選択。
重要なのは、「IDE統合モード」で、デフォルトは「フル」になってるんだが、「最小限」にする。どうも、「フル」にすると、何かが書き換えられてしまうらしい。よって、内蔵Tomcatで動かそうとしたときと同じエラーになっちゃう。
ちなみに、なんでここ「了解」ボタンが薄くなってるかっていうと、当然ディレクトリを選んでないからだヨーン。

2003年11月19日
一番ラクチンなのはAxisのときのように、このogsa-3.0.2/webapps/ogsaディレクトリをWebモジュールとしてNetBeans上にマウントして内部Tomcatで操ることなんだろうが、さすがに無理くさかった。かといってogsaに組み込まれたTomcat的コンポーネントはかなり改造されているようで、こいつをNetBeansに外部Tomcatとしてセットアップすることもできなかった。
結局やったのは外部の、第3のTomcatを導入することである。実はGT3環境は外部のTomcatに簡単に憑依することができると、GT3のユーザーズガイド(インストールなどの方法が書いてある)に出ていたのだ。そうしてこの第3の猫をNetBeansにセットアップしてやる。
まず、Tomcatの準備は簡単である。よくやるとおり、バイナリを解凍して、/export/home/noniko/tomcat4124とした。
そうして、ogsa-3.0.2ディレクトリ内で、
ant -Dtomcat.dir=/export/home/noniko/tomcat4124 deployTomcat
とやると、いろんなファイルがtomcat4124にコピーされて、BUILD SUCCESSFULと出る。
ただ、ここでtomcat4124にコピーされるwebapps/ogsa/WEB-INF/server-config.wsdd は、guide系サービスが登録される前のである。
今見たら、もとのディレクトリogsa-3.0.2/webapps/ogsa/WEB-INF/server-config.wsdd からも、guide系サービスは消えてしまっていた。antしたことで初期化されてしまったのかも知れない。
だが、
2003年11月07日
サンプルアプリケーションにはguide系とsamples系があるようだが、「GT3入門」ではこのうちguide系のサービスを試す例が載っている。ところがバイナリを解凍した時点ではなぜか、guide系のサービスはデプロイされていない。
すなわち、ogsa-3.0.2/webapps/ogsa/WEB-INF/libディレクトリの中に、guide.jarとかがないのだ。
そこで、こんなふうにした。
$cd ogsa-3.0.2
$ant deployGuide
そしたら結構長い時間かかったが、BUILD SUCCESSFULと出た。でもまだ上記のディレクトリには配備されてない。
/ogsa-3.0.2/guide/build/lib の中に、guide.jar, guide-stub.jar, counter.jar, guide.gar
というのができていた。
このうち.jarファイルだけを ogsa-3.0.2/webapps/ogsa/WEB-INF/libにコピーした。
.garファイルというのは、あとで調べたら、ナントカ.jar、ナントカ-stub.jarと、あとwsdlやらwsddやらのファイルをさらにまとめたものらしい。
この状態で一度、
$ant startContainer
とやった。するとデプロイされているサービスの一覧が表示される。その中に
[java] http://serveraddress:8080/ogsa/services/guide/counter/CounterFactoryService
というのがあって、目的のサービスがデプロイされたことがわかる。 そこで、一応
$ant stopContainer
でサービスを終了させておく。
これをやらなかったいろいろな場合と比べると次のような違いがあった。
まず、ant deployGuideとかやらなかった場合、コンテナを起動しても、上のようなguide系サービスの一覧は表示されなかった。
それから、deogsa-3.0.2/webapps/ogsa/WEB-INF/server-config.wsdd に、guide系のサービスは登録されていなかった。一度コンテナを起動させてから改めて見ると、今度は登録されていた。こんな感じに。
<service name="guide/counter/ServiceDataCounterFactoryService"
provider="Handler" style="wrapped" use="literal">・・・中略・・・
<service name="guide/counter/CounterFactoryService" provider="Handler"
style="wrapped" use="literal">・・・これが今試そうと思っているサービスである。後略。
不思議なものである。なお、guide系サンプルに固執したのはわたしがコイツでしか動作確認法を知らなかったためで、いきなり俺サービスを始めてダイジョブサッて場合は、こんなことする必要はもーとーない。
2003年11月07日
pure Javaで構成されるGT3のCoreの部分だけをダウンロードサイトからもらってくる。
まずは「Core Binary」とかかれてあるバイナリ。実は一度ソースからAntでBuildしようかと思ったけどどーもうまくいかない。
でも、「Core Source」ももらって来ちゃう。 Axisでやったように必要な実行ファイルだけを並べて、右クリ実行するためだ。
2003年11月07日
参考にしたのは、もちろん月刊誌JAVA Developer(ソフトバンク パブリッシング(株)発行)に連載の「グリッドコンピューティングGT3入門」・・・ていうか、この記事について行きたいためにこの環境を作り上げたようなものサッ。
そして、もちろんGlobus ToolkitのProgrammer's Tutorial。アプリケーション開発の最初の一歩を実に丁寧に教えてくれた。
2003年11月07日
2003年11月07日