第2回 JXTA-ShellとJXTA Java APIの関連
なぜ、対応しない部分が存在するのか? |
JXTA-ShellのコマンドとJXTA Java APIとの関係の一端を見てきましたが、receiver.java、sender.javaという2つのJavaプログラムの中の一部に、先に見たJXTA-Shellのコマンド列には対応するものの、ないシーケンスが含まれていることに注目してください。それは、ある意味では、これら2つのJXTAプログラムの最も特徴的な部分といってもいい、「告知」の公開・獲得にかかわる次のような部分です。
以前にも見たように、メッセージの「受け手」はパイプ告知を含むサービス告知を生成して、それをネットワーク上に公開します。メッセージの「送り手」はネットワーク上で公開されている「告知」を獲得し、その情報を基にして出力用のパイプを生成します。
「受け手」側の「告知」公開 |
discovery.publish(serviceAdv,
Discovery.ADV); // ローカル・キャッシュへの公開。 |
「送り手」側の「告知」獲得 |
enum = discovery.getLocalAdvertisements(Discovery.ADV,
"Name", "Maruyama-1"); |
なぜ、この部分がJXTA-Shellのコマンドでは欠けていたかを考えてみてください。その理由は、2つのJXTA-Shellコンソールを作って行ったメッセージ転送実験の手順の中にあります。今回は、2つのコンソールを作る以前に、pipeadv = mkadv -pで、パイプ告知を作って、それからコンソールを分割しました。ということは、このパイプ告知は2つのJXTA-Shellコンソールで最初から共有されていたので、わざわざ、公開・獲得の手順を踏む必要がなかったのです。
「告知」の公開と獲得に、shareとsearchを使う |
それでは、最初からShell -s でコンソールが2つに分かれている状態で、パイプを使った通信はどのようにしたらいいかを見ていきましょう。
まず、情報を受け取る(サーバ)側と送る(クライアント)側を決めます。受け取る側でpadv = mkadv -p marupipeのようにしてパイプ告知を作ります。ここでmarupipeは、このパイプ告知の名前(name)になります。そして受け取る側で、このパイプ告知を公開します。公開するにはコマンドshareをshare padvのように使います。
「受け手」側では、このパイプ告知を利用して入力用のパイプを作ります(ip = mkpipe -i padv)。「送り手」側では、searchコマンドを使って公開されている「告知」がないかを検索します。引数なしのsearchコマンドは、ローカルに公開されているすべての「告知」を検索します。search -rコマンドはネットワーク上で公開されている「告知」を検索します。searchコマンドでは、次のような形で条件付きの検索も可能です。
JXTA>search -r -aname -vmaru* <!DOCTYPE jxta:PipeAdvertisement>
|
「送り手」側では、獲得されたパイプ告知を使って出力用のパイプを作ります(op = mkpipe -o adv0)。あとは、これまで見てきたやり方で、メッセージの通信が可能となります。このshareとsearchの2つのコマンドを使うと、以前にJavaで書いたメッセージ転送のプログラムとほぼ同じことをJXTA-Shellの内部で実現できます。
「告知」をJXTA-Shellコマンドから獲得する |
当然といえば当然のことですが、Java APIから発行された「告知」とコマンドから発行される「告知」とに違いがあるわけではありません。これが、JXTAがプロトコル中心で、言語のbindingから自由であるということですので、それを確かめておきましょう(この例は、どちらもJavaで書かれたコマンドでしたね)。
まず、Javaで書いたreceiverコマンドを起動します。
|
このプログラムのソースの一部を、今度はコメント付きで再掲します。パイプ告知を1つ生成して、それに、Pipe Maruyama-1という名前を付けます。これは、padv = mkadv -p "Pipe Maruyama-1"というコマンドに相当するのですが、JXTA-Shellは、引数のパージングを手抜きしているので、内部にスペースを含んだ文字列をquoteすることができません。
このプログラムでは、パイプ告知を公開しているだけでなくパイプ告知を含んだサービス告知をキチンと生成して、それを公開しています。サービス告知には、パイプ告知のほかに、サービスの名前とか、サービスの提供者の名前、サービスのバージョンなどを指定しています。
// パイプ・サービス告知を生成して、告知に必要なパラメータを設定する。 // サービス告知を生成して、告知に必要なパラメータを設定する。 |
searchコマンドの利用 |
こうした公開されたサービス告知を、JXTA-Shellのsearchコマンドで検索します。次の例は、同じマシン上の2つのコンソールでの実験例ですので、searchコマンドを使っていますが、shareコマンドを発行したマシンが、searchコマンドを発行するマシンと異なる場合には、search -rが必要です。
searchコマンドを実行すると、発見された「告知」の一覧が表示されます。この例では、adv0からadv14まで15個の「告知」が見つかっています。このように、searchコマンドの出力は、\verb-adv+###-という形をした自動生成された変数に割り当てられます。
JXTA> search |
このままでは、どのような「告知」が獲得されたかは分かりません。一番簡単なのは、catコマンドで変数を出力させることです。この例では、最初の変数が、求めるものだということが分かっていました。catの出力を先のJavaの「告知」生成のコードと比較してみてください。
JXTA>cat adv0 <!DOCTYPE jxta:ServiceAdvertisement>
|
これで、JXTA-ShellコマンドとJXTA Java APIでの、「告知」の公開と獲得をめぐる対応関係は、明らかになったと思います。
次回は、JXTA-Shellのコマンドのソースを読んで、JXTA Javaでのプログラミングの基本的なスタイルを学ぶとともに、JXTA-Shellコマンドの働きを、すこし掘り下げて理解することを目指したいと思います。
Index | |
Page1 ●JXTA Shellのメッセージ通信のまとめ ●receiver.javaとsender.java ●「受け手」のスクリプトとreceiver.javaの比較 ●「送り手」のスクリプトとプログラムsender.javaの比較 |
|
Page2 ●なぜ、対応しない部分が存在するのか? ●「告知」の公開と獲得に、shareとsearchを使う ●「告知」をJXTA-Shellコマンドから獲得する ●searchコマンドの利用 |
|
連載記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|