こんにちは、もっと多くのJava技術者がCamelで楽できるはずと信じているツカノ(@snuffkin)です。
よくJavaで書くと冗長だと言われます。確かにそうだし、欠点もいろいろありますが、誇れる点も多くあります。そのひとつが、発達したJavaのエコシステムです。Javaで書かれたOSSは非常に多く、GitHub上に登録されている言語で最も多いのはJavaです。
自分に必要なOSSを使いこなせれば、実はそんなに書かなくて良いことが多いはずです。そのサポートを行ってくれるのがCamelです。
ちなみに、今回はJava Advent Calendar 2013の10日目の投稿でもあります。9日目は櫻庭さんによる、以下の投稿でした。
11日目は高橋徹さんによる、以下の投稿です。
さて、前回はいかがでしたか? ぶっちゃけ、「Hello, World!」程度じゃCamelのパワーは伝わりきらなかったと思います。前回は導入ということで、雰囲気を伝えることに注力しましたが、今回はもっと面白いサンプルを使って解説します。この記事を読めば、「自分の仕事で使えないか調べたくなる」くらいCamelのパワーが伝わるのではないかと思います。
コンポーネントの話
それでは、本題に入っていきましょう。今回はCamelのコンポーネント周りについて、紹介します。
Camelのコンポーネントを使いこなすことによって、発達したJavaエコシステムの恩恵を受けることができます。
そのあたりを詳しく説明します。
今回は、次のようなプログラムを作りながら説明します。
- twitterからキーワード「camel」で検索する
- 検索結果をJSONに変換する
- elasticsearchに書き込む
この目的なら通常はTwitter River Pluginを使うのかもしれませんが^^ ここでは、Camelを使います。
コンポーネントの調べ方
twitterやelasticsearchにアクセスする部分は、世の中的にはtwitter4jやelasticsearchのclientがあるはずです。こういう「OSSにアクセスする部分」をCamelではコンポーネントとして提供しています。
では、どのようなコンポーネントがあるのでしょうか? それは、Camelのコンポーネント一覧を見ると分かります。ここでは、Camelで提供しているコンポーネントがアルファベット順に並んでいます。
これを見て行くと、、、ありますね。「camel-elasticsearch」や「camel-twitter」があります。
OSSの名称の部分は、個々のコンポーネントの使い方が書かれたページにリンクしています。
ひとまず、camel-twitterの使い方を見てみましょう。
まずは、Mavenのdependencyにコンポーネントを登録するよう、書いてあります。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-twitter</artifactId> <version>${camel-version}</version> </dependency>
次にURI formatの説明として、以下のように書いてあります。
twitter://endpoint[?options]
この文脈で「URIって何?」と思うかもしれません。説明します。
前回のサンプルでfromやtoの引数に指定した文字列を、Camelでは「Endpoint URI」と言います。これは以下のようなフォーマットです。
※図はCamel in Actionから引用しました。
SchemeとはCamelのコンポーネントを表しています。今回のサンプルでは、twitterやelasticsearchのコンポーネントにあたります。
Context Pathはコンポーネントによっても違いますが、概ねどの機能を呼び出すかを表しています。
Optionsではそのコンポーネントを利用するための詳細なパラメータを指定します。
このように考えて、camel-twitterの使い方を読んでいくと、今回のサンプルでは以下のようなEndpoint URIを指定すれば良いことが分かります。(twitter APIのconsumerKey, consumerSecret, accessToken, accessTokenSecretについてはマスクしています)
twitter://search?type=direct&keywords=camel&consumerKey=xxx&consumerSecret=xxx&accessToken=xxx&accessTokenSecret=xxx
また、camel-elasticsearchの使い方ページを読んでいくと、以下のようなEndpoint URIを指定すれば良いことが分かります。
(clusterName=elasticsearch, indexName=twitter, indexType=tweetとしています)
elasticsearch://elasticsearch?operation=INDEX&indexName=twitter&indexType=tweet
camel-twitter以外もまとめて書くと、以下のdependencyをpom.xmlに入れます。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-twitter</artifactId> <version>${camel-version}</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-elasticsearch</artifactId> <version>${camel-version}</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jackson</artifactId> <version>${camel-version}</version> </dependency>
実装してみましょう
さて、ここまで分かったところで、この処理をCamelで実現するコードを書いてみましょう。
- TwitterCrowler.java
package snuffkingit.camel.example; import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.model.dataformat.JsonLibrary; public class TwitterCrowler { public static void main(String... args) throws Exception { CamelContext context = new DefaultCamelContext(); context.addRoutes(new RouteBuilder() { @Override public void configure() { from("twitter://search?type=direct&keywords=camel&consumerKey=xxx&consumerSecret=xxx&accessToken=xxx&accessTokenSecret=xxx") // (1) .marshal().json(JsonLibrary.Jackson) // (2) .to("elasticsearch://elasticsearch?operation=INDEX&indexName=twitter&indexType=tweet"); // (3) } }); context.start(); Thread.sleep(10 * 1000); context.stop(); } }
前回解説したあたりは飛ばして、簡単に解説します。
(1) twitterからキーワード「camel」で検索します。
(2) twitterからの検索結果をJSON形式に変換します。
(3) JSON形式の文字列をelasticsearchに書き込みます。
これを動かしてみると、twitterからキーワード「camel」で検索し、JSON形式に変換し、elasticsearchに書き込むことができます。
(今回の本題ではないため、twitter APIの登録や、elasticsearchのセットアップに関する説明は省略しています。また、1回検索して終了させていますが、常駐プロセスにして定期実行、というのもできます)
まとめ
今回のコードを振り返ってみると、以下のような特長があります。
- どのようにOSSにアクセスするのか分かっていれば、個々のOSSのAPIを直接使わなくて良い
- OSSへのアクセス方法はEndpoint URIとして抽象化されており、細かなパラメータは違えどフォーマットは共通
- Endpoint URIで記載することアクセスできるため、実装量が削減される
そして、Camelのコンポーネント一覧を見ると分かるように、Camelはかなり数のOSSに対応しています。この資産を使えば、OSSをつないだ処理を簡単に書くことができるようになります。
自分の仕事で使ってるOSSのコンポーネントが用意されているか、調べたくなったのではないでしょうか?
ぜひ、Camelを使ってもっと楽をしましょう!
Acroquest Technologyでは、キャリア採用を行っています。
- 日頃勉強している成果を、Hadoop、Storm、NoSQL、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
- 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
- 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
- OSSの開発に携わりたい。
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
キャリア採用ページ