Apache Camelに関する機能のまとめ (ドキュメントへのリンク集)


# Apache Camelに関して

http://camel.apache.org/

ダウンロード
http://camel.apache.org/download.html

軽量なEIPフレームワーク（メッセージ処理フレームワーク）。
http://www.eaipatterns.com/toc.html
色々な処理に関して考慮されたフレームワーク。
MVCが画面系の表なフレームワークで、EIPフレームワークは裏方のフレームワーク。
画面処理がないのに頑張ってMVCフレームワークで裏方なプログラムを書いている？
（逆にCamelはViewという概念が無いので画面系は弱い）
SAP HANA Cloud Integration という製品とかでも Apache Camelベースで作られてたりする。


Camel dev認定試験もあったり
http://www.redhat.com/ja/services/certification/rhcoe-camel-development

開発が進んでいるかどうかはディスカッションを見れば分かる。
http://camel.465427.n5.nabble.com/

軽量なので単なるライブラリとして見てもいいぐらい。
単体でも動くし、Tomcat等のコンテナに載せても動く。
試験は単体で、実際はコンテナサーバー動作というやり方でも問題ない。


# なぜメッセージ処理フレームワークが知られていないのか？

そもそもライセンスが高い分野の製品 `(「EAI」で検索)`
--> 費用対効果的にエンタープライズでミッションクリティカルな分野でしか使われない 
--> 結果的に誰も知らな〜い

そして手軽なオープンソースになったけど、そもそも使い方わからん！という分野。
これが気軽に使えるようになったから使わない手はない。

（注意）EAIは状態保持できるステートフルという高度なモデルもできるが、Camelはステートフルの仕組みはない。

# コンポーネント

設定でいろいろなシステムに接続できる標準で実装されているライブラリ。
http://camel.apache.org/components.html

必要に応じて取捨選択できる。

ver.2.14での追加コンポーネント

* camel-ahc-ws
* camel-atmosphere-websocket
* camel-box
* camel-dropbox
* camel-metrics
* camel-netty4
* camel-netty4-http
* camel-olingo2
* camel-openshift
* camel-google-drive
* camel-gora
* camel-rest (in camel-core)
* camel-spark-rest
* camel-schematron
* camel-swagger 

ver.2.15での追加コンポーネントは今のところ(開発中)

* camel-beanstalk - for working with Amazon Beanstalk jobs.
* camel-chunk - for templating with Chunk engine.
* camel-docker - to communicate with Docker.
* camel-github - for integrating with github(プルリク検知、プルリククローズ、コメントなど）
* camel-google-calendar - provides access to Google Calendar via the Google Calendar Web APIs.
* camel-google-mail - provides access to Gmail via the Google Mail Web APIs.
* camel-jira - for integrating with JIRA issue tracker
* camel-scr - for using Camel with SCR (OSGi declarative services) on OSGi containers such as Apache Karaf
* camel-spring-boot - for using Camel with Spring Boot
* camel-test-spring40 - for testing with Spring 4.0.x. camel-test-spring is for Spring 4.1.x onwards.



# ルート

コンポーネントをどういう順番で処理させるかを決めるストーリー的な仕組み。
`詳細な処理`と`ストーリー`を分離できるので、コードが見やすくなる。

ルートの書き方は色々

* Javaでコーディング
    * http://camel.apache.org/dsl.html
    * http://camel.apache.org/rest-dsl.html
    * (google guice)http://camel.apache.org/guice.html
* XMLで書く
    * http://camel.apache.org/loading-routes-from-xml-files.html
    * http://camel.apache.org/rest-dsl.html
* Spring XMLで書く
    * http://camel.apache.org/spring.html
    * http://camel.apache.org/rest-dsl.html
* blueprintで書く
    * http://camel.apache.org/using-osgi-blueprint-with-camel.html
    * http://camel.apache.org/rest-dsl.html
* Groovyで書く
    * http://camel.apache.org/groovy-dsl.html
* Scalaで書く
    * http://camel.apache.org/scala-dsl.html
* Kotlinで書く
    * 実装中・・・


ルートの機能としは下記のようなものがある。

* 条件分岐
    * http://camel.apache.org/content-based-router.html
* スロットル
    * http://camel.apache.org/throttler.html
    * データの流通量制御の事
    * 秒間１０件まで等の設定ができる
* 繰り返し
    * http://camel.apache.org/splitter.html
    * リスト形式のデータを繰り返して処理
    * ストリーム形式のデータを処理
    * マルチスレッドで処理
    * カンマ区切りで繰り返し処理など、繰り返しの区切りを指定
    * 繰り返し処理中のメッセージ集約実装
* ロードバランサ、フェールオーバー、サーキットブレーカー、マルチキャスト
    * http://camel.apache.org/load-balancer.html
    * ラウンドロビン、ランダム、加重分散
    * エラーが発生した時に別の分岐に流す
    * 何度もエラーが発生すると、そもそもエラーが発生する分岐にデータを流さない。（エラー処理のコストは高いので）
    * 全ての分岐にデータを流す
* 集約
    * http://camel.apache.org/aggregator.html
    * 複数のデータを待ち受けて１回の処理にまとめる
    * 指定時間だけ待ってデータをまとめる
    * 指定件数だけ待ってデータをまとめる
    * タイムアウト時間が来たら条件に構わずデータをまとめる
    * 集約するキーを指定して、種類が一緒のデータだけ集約する
* サンプリング
    * http://camel.apache.org/sampling.html
    * 100回に1回データを流して、他のデータは処理終了させる
* ストリームキャッシュ
    * http://camel.apache.org/stream-caching.html
    * 大きいデータをメモリで流通させるとメモリ不足になるので、処理中のデータをファイルで保持する仕組み
    * 例：ファイルのアップロード・ダウンロード等は大容量の場合はファイルで保持して、小さい場合はメモリで持ったりする仕組み

# ルート処理の開始


## ポーリング型

* ファイルコンポーネント
    * フォルダを定期的に監視-->取得-->ルートにメッセージ流す-->後処理
    * http://camel.apache.org/file2.html
    * 処理中のファイルに対して、ロックファイルがあると処理しない
    * ファイルサイズが増えているファイルは処理しない
    * タイムスタンプ順で処理
    * テンポラリフォルダに移動して処理
    * ファイル名の形式を指定
    * 後処理は、ファイルの削除・バックアップフォルダへ移動、ファイル名の変更など
* FTP/FTPS/SFTPコンポーネント
    * FTPのフォルダを定期的に監視-->取得-->ルートにメッセージを流す-->後処理
    * http://camel.apache.org/ftp.html
    * ファイルコンポーネントの拡張なので、一部の機能をのぞいてファイルコンポーネントの機能が使える
* DBコンポーネント
    * クエリの実行-->レコード取得-->ルートにメッセージを流す
    * http://camel.apache.org/sql-component.html
    * http://camel.apache.org/mybatis.html
    * http://camel.apache.org/hibernate.html
    * http://camel.apache.org/mongodb.html
    * http://camel.apache.org/redis.html
    * など
* Timerコンポーネント
    * http://camel.apache.org/timer.html
    * 指定時間ごとにルートにメッセージを流す
* スケジューラーコンポーネント
    * http://camel.apache.org/quartz2.html
    * cronみたいな感じ
    * 指定曜日、指定時刻ごとにルートにメッセージを流す
* メール受信コンポーネント
    * http://camel.apache.org/mail.html

## リスナ型

* HTTPを受信すると処理を開始
    * http://camel.apache.org/servlet.html
    * http://camel.apache.org/jetty.html
* TCP, UDPを受信すると処理開始
    * http://camel.apache.org/netty.html
    * http://camel.apache.org/mina2.html


# エラーハンドリング・トランザクション

http://camel.apache.org/exception-clause.html

* トランザクション処理 --> ロールバック、スキップ処理、即コミット
* リトライ◯回、１〜◯回目までは◯秒間隔でリトライ、その後は◯秒間隔でリトライ。
* エラーログ（スタックトレースではなくパンくずリスト形式で出力）
* エラー用ルート

# 型変換 

http://camel.apache.org/type-converter.html

* TypeConverterという機能で元々の型を意識させない作りができる

データ変換はTypeConverterに登録しておいて、あとは好きなタイミングで使うだけ。
コンポーネントは元々の型を意識しない作りができる。
変換できない場合はNo TypeConverterとしてエラーになる

独自の業務データ（クラス）に関しても、変換を実装して登録しておけばよい。
業務ロジックと分離した作りができる。

例　
```
exchange.getIn().setBody("123");
int i = exchange.getIn().getBody(int.class);
```



# データ変換

http://camel.apache.org/data-format.html

* JSON
* XML
* CSV
* 固定長
* zip
* base64
* RSS
* iCal
* Barcode?

などなどのデータ変換ができる。
marshal(), unmarshal() のメソッドで切り替え
例えばJSONの場合下記の両方あるという意味（片方の変換しかないライブラリもある）

* JSON --> Object
* Object --> JSON

その他セキュリティ関連（SSLなど）の情報に関しては

* http://camel.apache.org/security.html

# 環境変数やプロパティファイルの処理

http://wiki.buildria.com/camel/basis/property
http://camel.apache.org/using-propertyplaceholder.html

コンポーネントの設定にできる

* パスワード
* ディレクトリなどの環境情報
* 接続先HTTP URL、PATH


#運用

全てが手作りだと運用まで考えた作りまで手が回らないのでフレームワークに任せる

##グレースフルな停止

http://camel.apache.org/graceful-shutdown.html

ルートで処理中のデータがあったら処理（スレッド）を止めない仕組み。
タイムアウト設定もできる。
inflight exchanges = 処理中のメッセージ数

##自動起動OFF, ルートの起動順序

http://camel.apache.org/configuring-route-startup-ordering-and-autostartup.html

通常のアプリは起動したら勝手に動き出すものだけど、一部分だけ起動後はアプリの動作をしてもらいたくないパターンもある。
起動順序を制御したいパターンも出てくる。

##ルート起動停止の自動化

* スケジューラによる自動起動・停止
    * http://camel.apache.org/simplescheduledroutepolicy.html
    * http://camel.apache.org/cronscheduledroutepolicy.html

##状態確認

* データ処理時間の確認
* エラー件数の確認
* 処理件数の確認
* JMX
    * http://camel.apache.org/camel-jmx.html

# ツール

* http://hawt.io/
    * JMXでの情報取得、操作
    * Camelのルート状態を取得・起動・停止・一時停止
    * Camelをトレースモードに切り替え、流通データの動的取得

# 試験

テストの仕組みが充実していて、ここの枠だけだと大変なので別に説明
テスト関連のドキュメント

* http://camel.apache.org/testing.html
* http://camel.apache.org/camel-test.html
* http://camel.apache.org/spring-testing.html
* http://camel.apache.org/mock.html
* http://camel.apache.org/dataset.html
* http://camel.apache.org/notifybuilder.html
* http://camel.apache.org/advicewith.html