ここでは,ユーザプログラムをRaSC上で稼働させることにより,ネットワークを介した呼び出しを可能とする手順を説明します. 呼び出しプロトコルとして,MessagePack RPC, JSON RPC, ProtocolBuffers, SOAPが利用可能になり,用途に応じてプロトコルを使い分けることができます.
RaSC上で稼働させられるプログラムは, RaSCサービス化可能なプログラム で述べられたような条件を満たす必要があります. ここでは,そのような条件を満たす形態素解析エンジン MeCab を例に説明します.
まず RaSC の基本パッケージをダウンロードして解凍します. [1]
$ curl -o rasc-basic-1.0.2.zip "http://alaginrc.nict.go.jp/rasc/cgi-bin/dl.cgi?name=rasc-basic-1.0.2&type=zip"
$ unzip rasc-basic-1.0.2.zip
解凍すると,以下のファイルが展開されます.:
rasc-basic-1.0.2/
+ build.xml
+ jp.go.nict.wisdom.wrapper/
+ lib/
+ … (必須ライブラリ群)
+ script/
+ webapps/
+ WEB-INF
+ services/
+ SampleService.xml (サービス定義XMLの例)
このチュートリアルで作成するRaSCサービスは,Webアプリケーションをパッケージした war として作成し,それをJava ServletコンテナのJettyで動作させることになります.
WEB-INF/services 以下に置かれたサービス定義XMLのファイル名(拡張子を除いた部分)がサービス名になります.ここでは,MeCabをRaSCサービス化することを想定して,名称を変更します.
$ mv webapps/WEB-INF/services/SampleService.xml webapps/WEB-INF/services/MeCabService.xml
また,サービスの名前を設定するのに,以下の3つのファイルの編集が必要です.
まず,webapps/WEB-INF/serviceimpl/MeCabService.xml を開いて, 下記のように ___PATH_TO_PROGRAM___ となっている箇所に,実行したいユーザプログラムのコマンドラインを設定します. このファイルでは,RaSCが呼び出す実行プログラムに応じた設定を記述しています.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="target"
class="jp.go.nict.langrid.servicecontainer.handler.TargetServiceFactory">
<property name="service">
<bean class="jp.go.nict.wisdom.wrapper.StdIOCommandService">
<property name="cmdLine" value="___PATH_TO_PROGRAM___" />
<property name="delimiterIn" value="\n" />
<property name="delimiterOut" value="EOS\n" />
</bean>
</property>
</bean>
</beans>
次に,war を作成する build.xml を編集します.下記の ___WAR_NAME___ となっている箇所を変更し,war のファイル名を設定します. ここでは, jp.go.nict.rasc.mecabservice とすることにします.先に編集したXMLと同じ名前である必要はありません.
<target name="war" depends="wrapper">
<property name="war_name" value="___WAR_NAME___"/>
<war destfile="build/${war_name}.war" webxml="webapps/WEB-INF/web.xml">
<webinf dir="webapps/WEB-INF" includes="**/*.*" excludes="**/web.xml" />
<lib dir="lib" includes="**/*.jar" />
<lib dir="build" includes="wrapper.jar" />
</war>
</target>
最後に, サーバの設定を記述した settings.json を編集します.___WAR_NAME___ には,先に設定したものを使います. また, ___SERVICE_NAME___ には,先に設定したXMLファイルの名前 (MeCabService) を設定します.
{
"serverName" : "RaSCServer",
"jettyPort" : 8080,
"controlPort" : 0,
"httpServices" : [
{ "contextPath":"/___WAR_NAME___",
"serviceName":"___SERVICE_NAME___",
"warPath":"../build/___WAR_NAME___.war" }
]
"msgpackServices" : [
{ "contextPath":"/___WAR_NAME___",
"serviceName":"___SERVICE_NAME___",
"warPath":"../build/___WAR_NAME___.war",
"msgpackPort":9090 }
]
}
同梱されたデフォルトの設定では,MessagePack RPCにポート9090,JSON RPC, ProtocolBuffers, SOAPなどHTTP上のプロトコルにポート8080を割り当てます.
パッケージを展開したパスで,下記のコマンドを実行すると,warが作成され,RaSCサービスが起動します. このサービスは,MessagePack RPC,JSON RPC, ProtocolBuffers, SOAPのいずれのプロトコルでも呼び出せます.
$ ant
$ cd script
$ sh ./basic_server.sh start
なお,停止は下記のコマンドで行います.
$ sh ./basic_server.sh stop
以下では,JSON RPCによる呼び出し方法を紹介します.JSON RPCを用いることのメリットは,簡便さと理解しやすさです. 例えば下記のように,curlコマンドを用いて,JSON RPCでサービスを実行することができます. GETパラメータに,メソッド名とパラメータを渡しています.
$ curl "http://localhost:8080/jp.go.nict.rasc.mecabservice/jsonServices/MeCabService?method=analyze¶ms=\[\"今日の天気はどうですか\"\]"
JSON RPCについては,簡易的にブラウザ上からテストするためのインターフェースを用意しています. 下記のURLをブラウザで開くと,インタフェースが表示され,サービス呼び出しを行えます.___WAR_NAME___ は先に設定したものに置き換えてください.:
http://localhost:8080/___WAR_NAME___/jsonServices/
以下にスクリーンショットを示します.String analyze(String) というメソッドについて, “+”をクリックすると,入力欄が開きます. ユーザプログラムに与えたい内容を入力して,”invoke” を押すとJSON RPCでの呼び出しが行われ,結果が表示されます.
その他のプロトコルでの呼び出しについては,以下で説明しています.
[1] | このパッケージは,GitHubに登録されたプロジェクトpkg_basicから生成されたものです. |