MessagePack-RPC を試してみる

MessagePack-RPC の Java を試してみようと格闘している。
サーバ側のコード。

package jp.heavenshell;

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

public class ServerApp {
    public String echo(String msg) {
        return "hello " + msg;
    }

    public int add(int x, int y) {
        return x + y;
    }

    public int sub(int x, int y) {
        return x - y;
    }

    public int multi(int x, int y) {
        return x * y;
    }

    public int div(int x, int y) {
        if (y == 0) {
            return 0;
        }
        return x / y;
    }

    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();
    }
}

クライアント側。

package jp.heavenshell;

import org.msgpack.MessagePackObject;
import org.msgpack.rpc.Client;
import org.msgpack.rpc.loop.EventLoop;

public class ClientApp {
    public static void main(String[] args) throws Exception {
        Client cli = new Client("localhost", 1985, loop);
        MessagePackObject result = cli.callApply("echo", new Object[]{"world"});
        System.out.println(result.asString()); // hello world
        result = cli.callApply("add", new Object[]{1, 2}); // 3
        svr.close();
        loop.shutdown();
    }
}

ついでに他言語からも出来ないかと思って試した。
クライアントが PythonPyPi にはアップロードされていないので、Github から clone して setup.py を実行

$ git clone https://github.com/msgpack/msgpack-rpc.git
$ cd msgpack-rpc/python
$ python setup.py test
$ python setup.py install
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from msgpackrpc.client import Client
from msgpackrpc.transport import tcp

client = Client(tcp.TCPTransport, ('localhost', 1985), {})
ret = client.send_request('echo', ['world'])
print ret.result()
ret = client.send_request('add', [10, 5])
print ret.result()
ret = client.send_request('sub', [10, 5])
print ret.result()
ret = client.send_request('multi', [10, 5])
print ret.result()
ret = client.send_request('div', [10, 5])
print ret.result()
ret = client.send_request('div', [10, 0])
print ret.result();
hello world
15
5
50
2
0

Perl の AnyEvent::MPRPC をクライアント。

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
use AnyEvent::MPRPC;
my $d = $client->call('echo', ['foo bar']);
my $res = $d->recv; 
warn Dumper $res;

が、Perl は結果をずーっと待っていて応答がない。

my $server = mprpc_server '127.0.0.1', '1985';
$server->reg_cb(
    echo => sub {
        my ($res_cv, @params) = @_;
        $res_cv->result(@params);
    }
);
AnyEvent->condvar->recv;

こんな感じで Perl でサーバを書いたら Perl のクライアントは動いたんだけどなー。
ちなみに Python がクライアントでサーバが Perl でもちゃんと Python 側に処理は返った。