Spring XD で Gmail を HipChat に転送する

Spring XD の環境が整ってきたので、ここからは実際に使ってみます。

#環境
- Ubuntu 14.04
- Nginx 1.4.6
- Java 1.8.0_66
- Spring XD 1.3.0.RELEASE
- Flo for Spring XD 1.0.0 GA (flo-spring-xd-admin-ui-client-1.3.0.RELEASE)

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS"
$ uname -a
Linux 133-130-119-232 3.16.0-51-generic #69~14.04.1-Ubuntu SMP Wed Oct 7 15:32:41 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ nginx -v
nginx version: nginx/1.4.6 (Ubuntu)
$ java -version
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)
$ ./xd-shell
 _____                           __   _______
/  ___|          (-)             \ \ / /  _  \
\ `--. _ __  _ __ _ _ __   __ _   \ V /| | | |
 `--. \ '_ \| '__| | '_ \ / _` |  / ^ \| | | |
/\__/ / |_) | |  | | | | | (_| | / / \ \ |/ /
\____/| .__/|_|  |_|_| |_|\__, | \/   \/___/
      | |                  __/ |
      |_|                 |___/
eXtreme Data
1.3.0.RELEASE | Admin Server Target: http://localhost:9393
Welcome to the Spring XD shell. For assistance hit TAB or type "help".
xd:>
```

以前セットアップした環境を引き続き利用します。

- [Spring XD のセットアップを試してみた話](http://qiita.com/yo1000/items/a8c92cc5931e79080a5d)
- [Flo for Spring XD でグラフィカルに XD をあつかう話](http://qiita.com/yo1000/items/855d6307ad2db2d90200)
- [Spring XD のフロントに Nginx を置いたらハマった話](http://qiita.com/yo1000/items/f6d08a18eb2082294fd4)
- [Spring XD の認証機能を有効化した話](http://qiita.com/yo1000/items/44b2378f0710a0369c88)

#ストリームの作成とデプロイ
さっそく試してみます。
今回はストリーム処理で、Gmail の受信トレイに届いたメールを、リアルタイムで HipChat に届けてみようと思います。

作成したサーバーの Admin UI から、[STREAMS] > [Create Stream] とメニューをたどっていきます。
ローカルにサーバーを立てた場合、http://localhost:9393/admin-ui/#/streams/create にアクセスしても目的の画面に到達します。
<img width="1191" alt="スクリーンショット 2015-12-07 14.53.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/391162e2-e2ed-da69-b721-fff98b1e5fb6.png">

画面左の source グループからは `mail` を、processor グループからは `http-client` を、sink グループからは `null` を、それぞれ選択して、編集エリアへドラッグします。
![spring-xd-flo-2.gif](https://qiita-image-store.s3.amazonaws.com/0/47993/1f0f18f4-0e69-ee53-45ef-e6d41152e59b.gif)

それぞれの箱の端についている、黒い点同士を重ねるように配置していきます。
![spring-xd-flo.gif](https://qiita-image-store.s3.amazonaws.com/0/47993/64240cd6-4ed7-8d50-b732-0100152d0f1e.gif)

編集したい箱をクリックし、編集エリア下部でプロパティを設定していきます。
![spring-xd-flo-4.gif](https://qiita-image-store.s3.amazonaws.com/0/47993/07dafd4e-48f1-5bdc-4915-71c8156668dc.gif)

設定値はそれぞれ以下のとおりです。

**mail**

| name        | value                   | note                   |
|:------------|:------------------------|:-----------------------|
| delete      | false                   |                        |
| host        | imap.gmail.com          |                        |
| username    | {user-name}%40gmail.com | @ は %40 にエスケープ   |
| port        | 993                     |                        |
| password    | {user-password}         |                        |
| protocol    | imaps                   | Gmail の場合 IMAPS 必須 |
| outputType  | text/plain              |                        |
| maxMessages | 10                      |                        |

**http-client**

| name        | value                  | note                   |
|:------------|:-----------------------|:-----------------------|
| url         | `'''https://api.hipchat.com/v2/room/{room-id}/notification?auth_token={token}'''` | URL はシングルクオート3つで囲む |

**null**
(設定不要)

ここまでできたら、いよいよストリームを作成・デプロイしてみます。
[Create Stream] ボタンをクリックして、ストリームに名前をつけたら、"Deploy stream(s)" にチェックを入れて、[Create] します。
![spring-xd-flo-5.gif](https://qiita-image-store.s3.amazonaws.com/0/47993/e5d89c97-474a-62e8-add5-f08dae9590b3.gif)

#ストリームの動作確認
デプロイしたストリームが正しく動作するか確認してみます。

うまく作成できていれば、設定した Gmail アカウントにメールが着信したタイミングで、HipChat にメッセージが連携されるはずです。

送ってみたメールがこちら。
**14:08** に送信。
<img width="586" alt="スクリーンショット 2015-12-07 14.09.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/7851a24c-386f-f8cc-00cd-767327cf0ca2.png">

届いたチャットメッセージがこちら。
**14:08** に受信。
<img width="1020" alt="スクリーンショット 2015-12-07 14.11.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/b675d9b6-9c45-fdf4-f1b9-910b407900a0.png">

即座に連携されていることが確認できますね！
設定はこれで問題なさそうです。

#まとめ

Spring XD を利用すると、こんな具合に簡単にストリーム処理を作成できます。

これまでこの手の技術の多くは、ビッグデータまわりで多く利用されてきたように感じますが、最近では Reactive というキーワードとともに、ビッグデータ以外の領域でも利用が広がってきているようです。

今回のデモを通じて、かなり いろいろなものを連携できることが実感できたかと思います。
より実務的な利用を考えると、ログ解析や、その連携などのリアルタイム化あたりが、現実的な利用シーンとなるでしょうか。

ローカル・リモート問わず、実に様々なリソースを連携できる Spring XD。
今後は [Spring Cloud Data Flow](http://cloud.spring.io/spring-cloud-dataflow/) というプロダクトにリファクタリングされ、プロジェクトが継続していくようです。
ただし Spring Cloud Data Flow は、まだ Beta リリースのみのため、当面は Flo 含めた全機能を利用したい場合は、Spring XD を選択することになります。

まだいろいろ遊べそうなので、引き続き追いかけてみようと思います。