MessagePack-RPC(Java Binding)を ivy でインストールする


業務でクライアントサーバ型のプロトタイプを作る際にMessagePack-RPCを使ってみたので手順をまとめます。

公式サイトのQuickStartと違う点は、MavenではなくAntを使ってビルドしてみたというところです。
Apache Ivy™をちゃんと使ったことが無かったのでついでに試してみました。

MessagePack-RPCについて

元々、Thriftを使ってみるつもりだったのですが、
同僚にこちらをお勧めされました。見てみると以下のような印象を持ったのでこちらを試してみます。

  • 開発が活発そう
  • ドキュメントが多そう
  • サーバの実装がちゃんとしてそう

ivyをインストール

ダウンロードサイトから最新版(執筆現在:2.2.0)をダウンロードし、展開して出来たivy-2.2.0.jarANT_HOME/libにコピーします。

ivyによるMessagePack-RPCインストール

公式サイトのQuickStartでは、Mavenを使って必要なjarファイルを取得するように案内されていましたが、Apache Ivy™を使ってもMaven用のリポジトリから必要なjarファイルを取得することができます。

以下、開発用のディレクトリに移動して作業を行います。

STEP1

Maven用の設定を参考にして、MessagePack-RPCの依存関係を記述します。

<ivy-module version="2.0">
  <info organisation="lab.synergy" module="ivytest"/>
  <dependencies>
    <dependency org="org.msgpack" name="msgpack-rpc" rev="0.6.1-devel"/>
  </dependencies>
</ivy-module>

これを使って必要なライブラリを取得するには以下の様なビルドファイルを書けば良いはずです。

<project name="test" xmlns:ivy="antlib:org.apache.ivy.ant">
  <target name="resolve" description="--> retrieve dependencies with ivy">
    <ivy:retrieve />
  </target>
</project>

これを動かすと、エラーになります。msgpack-rpcはivyがデフォルトで参照しに行くリポジトリには無いからです。

STEP2

リポジトリの場所を設定するために、ivy-settings.xmlという設定ファイルを作ります。

<ivysettings>
  <settings defaultResolver="msgpack" />
  <resolvers> 
    <ibiblio name="msgpack" m2compatible="true" root="http://msgpack.org/maven2/"/>
  </resolvers>
</ivysettings>

設定ファイルの場所を指定するようにbuild.xmlを変更します。

  <property name="settings.dir" location="settings" />
  <target name="resolve" description="--> retrieve dependencies with ivy">
    <ivy:settings file="${settings.dir}/ivy-settings.xml"/>
    <ivy:retrieve />
  </target>

今度は、別のjarが見つからないというエラーになります。上の設定では、デフォルトのリポジトリを参照しないためです。

STEP3

明示的に両方のリポジトリを指定してみます。

<ivysettings>
  <settings defaultResolver="m2compatibles" />
  <resolvers> 
    <chain name="m2compatibles" returnFirst="true">
      <ibiblio name="maven2" m2compatible="true"/>
      <ibiblio name="msgpack" m2compatible="true" root="http://msgpack.org/maven2/"/>
    </chain>
  </resolvers>
</ivysettings>

今度は上手くいきました。lib/以下にjarファイルがダウンロードされます。

動作確認用

動作確認のため、簡単なプログラムを作成します。

import org.msgpack.rpc.Server;
import org.msgpack.rpc.loop.EventLoop;

public class ServerApp {
    public String hello(String msg, int a) {
        return msg;
    }

    public static void main(String[] args) throws Exception {
        EventLoop loop = EventLoop.defaultEventLoop();

        Server svr = new Server();
        svr.serve(new ServerApp());
        svr.listen(1985);

        loop.join();
    }
}
import org.msgpack.rpc.Client;
import org.msgpack.rpc.loop.EventLoop;

public class ClientApp {
    public static interface RPCInterface {
        String hello(String msg, int a);
    }

    public static void main(String[] args) throws Exception {
        EventLoop loop = EventLoop.defaultEventLoop();

        Client cli = new Client("localhost", 1985, loop);
        RPCInterface iface = cli.proxy(RPCInterface.class);

        System.out.println(iface.hello("hello", 1));
        loop.shutdown();
    }
}

コンパイル、実行する手順を追加します。

  <property name="lib.dir" location="lib" />
  <property name="build.dir" location="build" />
  <property name="src.dir" location="src" />

  <path id="lib.path.id">
    <fileset dir="${lib.dir}" />
  </path>
  <path id="run.path.id">
    <path refid="lib.path.id" />
    <path location="${build.dir}" />
  </path>

  <target name="compile" depends="resolve" description="--> compile server and client">
    <mkdir dir="${build.dir}" />
    <javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="lib.path.id" />
  </target>

  <target name="run-server" depends="compile" description="--> run the server">
    <java classpathref="run.path.id" classname="ServerApp" />
  </target>

  <target name="run-client" depends="compile" description="--> say hello">
    <java classpathref="run.path.id" classname="ClientApp" />
  </target>

起動してみます。

ant run-server &
...

ant run-client
...
run-client:
     [java] hello

BUILD SUCCESSFUL
Total time: 0 seconds

動きました。今回はサーバとクライアントを両方Javaで書いているのであまりメリットを感じないですが、気軽にプロセス間通信が実装できるのでこれからも色々試そうと思います。


This entry was posted in 技術. Bookmark the permalink.