こないだの週末にMessagePackのオンラインハッカソンがあったってのは知ってたのですが、
MessagePackは自分にとっては、使ってるミドルウエアに内包されてるくらいで、
特にソレそのものをホゲホゲするあれでもなく、、。@muga_nishizawaがやってるって事で触ってみよかなー、と。
■ やること
1. JavaでHTTPクライアント作ってMessagePackでシリアライズしたデータを送信
2. Java(Spark)でサーバーを立てて取得したデータをMessagePackでデシリアライズ
3. Ruby(Sinatra)でサーバーを立てて取得したデータをMessagePackでデシリアライズ
1.と2.はIntelliJ IDEAで、3.はRubyMineでやっていきます。
#言語間をまたぐってのはアレなのですが、先日IntelliJに関するブログを書きましたが、
#実はその時のJetBrainsの75%オフセールでRubyMineのライセンスも買いました。
#どうも調べてくと、IntelliJとRubyMineは同じコードベースで、IntelliJにはRubyMineのプラグインが
#あるっちゅうことで、RubyMineのライセンス要らなかったじゃんって感じなのですが、
#せっかく買ったので使ってみたいなと…w
■ JavaでHTTPクライアント
application/octet-streamでMessagePackでシリアライズしたHogeオブジェクトを
bodyに詰めてサーバーに送信します。
#後からみたらコンテントタイプはapplication/x-msgpackが良さげですかね~
public class MessagePackHttpClient {
public static void main(String args[]) throws Exception{
Hoge hoge = new Hoge();
hoge.id = 1;
hoge.message = "Hello Hoge!";
DefaultHttpClient client = new DefaultHttpClient();
HttpHost host = new HttpHost("localhost", 【ポート】);
HttpPost post = new HttpPost("/");
MessagePack messagePack = new MessagePack();
ByteArrayEntity entity = new ByteArrayEntity(messagePack.write(hoge), ContentType.create("application/octet-stream"));
post.setEntity(entity);
HttpResponse response = client.execute(host, post);
System.out.println(response.getStatusLine().getStatusCode());
client.getConnectionManager().shutdown();
}
}
ちなみにHogeオブジェクトは↓こんな感じ。@Messageアノテーション付ける。お手軽。
@Message
public class Hoge {
public int id;
public String message;
}
HTTPクライアント、MessagePack、Spark(サーバー用)をpom.xmlに定義。
<repositories>
<repository>
<id>Spark repository</id>
<url>http://www.sparkjava.com/nexus/content/repositories/spark/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.2.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>msgpack</artifactId>
<version>0.6.7</version>
</dependency>
<dependency>
<groupId>spark</groupId>
<artifactId>spark</artifactId>
<version>0.9.9.4-SNAPSHOT</version>
</dependency>
</dependencies>
■ Java(Spark)でサーバーを立てて取得したデータをMessagePackでデシリアライズ
POSTで取得したbodyのバイト配列を取得するのにHttpServletRequestで~ってやんなきゃなのは
ちょっとめんどくちゃいなぁ。
public class SparkSample {
public static void main(String[] args) {
setPort(9996);
post(new Route("/") {
@Override
public Object handle(Request request, Response response) {
MessagePack messagePack = new MessagePack();
try {
System.out.println(request.body());
HttpServletRequest req = request.raw();
Hoge hoge = messagePack.read(req.getInputStream(), Hoge.class);
System.out.println("id:" + hoge.id);
System.out.println("message:" + hoge.message);
} catch (Exception e) {
e.printStackTrace();
}
return "Hello";
}
});
}
}
■ Ruby(Sinatra)でサーバーを立てて取得したデータをMessagePackでデシリアライズ
なんでしょうね、このお手軽さ。。
ただ、Javaクライアントの@Messageでシリアライズしたデータが、Rubyの中でどう解釈されてるのか
調べたいなぁ。RubyのクライアントからJavaに送るときにreadでオブジェクトにセット出来なかったりしたので。
class SinatraSample
require 'sinatra'
require 'msgpack'
set :port, 9997
post '/' do
puts MessagePack.unpack(request.body.read)
end
end
■ そんなこんなで、、
JSONで他システムとデータをやりとりする機会がココ数年すごい増えてるので、
言語をまたいでサクっと扱えるこのライブラリはナイスだな~。
あと、JetBrainsのプロダクト使ってくと、あんまりJavaが苦じゃない事が多いかも。
もちろんRubyMineもGemのインストールとかスゴイ楽チンだし、Sinatraを使った時の
コードの短さとかもビビりますけどね。。
そういえばDeNAさんの↓この本にもMessagePackの記載あったような。また読み返そうかな。
技術評論社
売り上げランキング: 45,787



コメント