サンプルアプリケーションの概要
サンプルアプリケーションでは、図1に示すようなバックエンドでのデータ管理と郵便番号から住所データを提供するような簡単なアプリケーションです。今回は、バックエンドでのデータ管理について説明します。
![図1:サンプルアプリケーションのイメージ](http://cz-cdn.shoeisha.jp/static/images/article/11673/11673_001.png)
このアプリケーションでは、表1のデータ登録方法を提供します。
手法 | 概要 |
---|---|
ファイルアップロード | HTTPでのファイルアップロードからデータを取り込む機能 |
データ受信 | FTPやSCPなど指定したフォルダ内のファイルを取り込む機能 |
データ取得 | 外部WEBサイトからデータを取得し自動で取り込む機能 |
Apache Camel
今回のサンプルアプリケーションはApache Camelを使ってデータ処理を行っています。
Apache Camelは図1のように、さまざまなデータの入出力を行うコンポーネントを組み合わせることで、開発者がデータ操作に集中できるフレームワークです。
用意されている入出力コンポーネントはApache Camelのサイトの通り、非常に多くあるのがわかります。自分で独自の入出力コンポーネントを作成することもでき、特殊な入出力に対応することも可能です。
こういったフレームワークはEIP(Enterprise Integration Patterns)フレームワークと呼ばれていて、同様なフレームワークにはSpring Integrationがあります。EIPフレームワークという言葉に慣れていなくても、EAI(Enterprise Application Integration)製品という言葉なら知っている方もいると思います。
EIPフレームワークはEAI製品が行っている処理と同様のことができます。また、一部のEAI商用製品では内部のシステムとしてApache Camelを使っているケースなどもあります。
![図2:Apache Camelのイメージ](http://cz-cdn.shoeisha.jp/static/images/article/11673/11673_002_s.png)
Spring BootでのApache Camelの利用
Spring BootでApache Camelを使うとき、Gradleの場合には、リスト1のように「org.apache.camel:camel-spring-boot-starter」というスターターを追加します。
dependencies { : // (省略) implementation 'org.apache.camel:camel-spring-boot-starter:2.24.1' }
処理ルールの記述方法
Apache Camelの処理ルールは、図3のようにRouteBuilderクラスを継承したクラスをBean登録すると自動的に動作するようになります。
![図3:Apache Camelの処理ルールの記述](http://cz-cdn.shoeisha.jp/static/images/article/11673/11673_003.png)
実際の処理内容の説明は後述しますが、処理ルールはリスト2のような流れで記述します。
import org.apache.camel.builder.RouteBuilder; : (省略) @Component public class ZipcodeImportRouteBuilder extends RouteBuilder { // (1) 定義を宣言する設定 @Override public void configure() throws Exception { // (2) 処理ルートを定義する from("file://" + file.getAbsolutePath() + File.pathSeparator + "import").process(new Processor() { @Override public void process(Exchange exchange) throws Exception { // ファイルが存在したときの処理を記述 } }).to("direct:import"); // (3) ルートは複数指定できる from("direct:import").process(new Processor() { // (省略) }); } }
(1)のconfigureメソッド内に処理の流れを宣言します。(2)と(3)のように複数の処理の流れを宣言することも可能です。from()メソッドはデータの入力元を示し、process()メソッド内でデータ処理を記述します。最後のtoで出力先を指定します。(2)の出力を(3)での入力として利用しています。これらの流れを図にすると、図4になります。
![図4:Apache Camelのルート定義](http://cz-cdn.shoeisha.jp/static/images/article/11673/11673_004.png)
ルート定義の方法には、ここで紹介した以外にもデータの分岐やフィルタ処理など、多彩な記述が行えます。また、Java以外のXML等など記述方法もいろいろあるので、詳しくはApache Camelの利用マニュアルを見てください。