CONTAINER技術系のこと書きます。いうものがあることを知った。いう音楽のストリーミングサービスを提供する会社が作ったものらしい。寄贈されてインキュベータープロジェクトとなった。特徴としては、バッチ処理に特化している点が挙げられる。定期的にバッチ処理を実行するような機能はない。使ってやる必要がある。使って書く必要がある。一通り触ってみることにする。使った環境は次の通り。使ってさくっとできる。おける最も重要な概念としてタスクというものを知る必要がある。やらせたい何らかの仕事を細分化した最小単位となる。いうクラスを継承したサブクラスを作る。次のサンプルコードでは、最も単純なタスクを定義している。メソッドをオーバーライドしてメッセージをプリントするようになっている。main()上記のタスクを実行するには、次のようにする。オプションは、タスクのスケジューラをローカルモードに指定している。スケジューラにはローカルとセントラルの二種類があるんだけど、詳しくは後ほど説明する。開発用途で使うならローカル、と覚えておけば良いかな。--local-scheduler実際に実行してみると、次のような出力が得られる。タスクが成功していることや、ログの中にメッセージが出力されていることが見て取れる。=====上記は、代わりに次のようにすることもできる。モジュールを実行して、そこ経由でタスクを実行している。--local-schedulerこのやり方の利点としては、パッケージ化されたインストール済みのタスクを実行できる点が挙げられる。指定して実行していた。場所に関わらず実行できる。含まれるので、先ほどと同じように実行できるというわけ。モジュールとかがよく分からないというときは必要に応じて以下を参照してもらえると。ファイルのことだよ、という点。コマンドを使うこともできる。オプションで指定する。環境変数を指定する必要がある。--local-scheduler実行するタスクをモジュール内で指定するとはいえ、毎回コマンドラインで実行するモジュールを指定するのも面倒だと思う。実行するときのパラメータを指定してやると良さそう。開発や検証用途なら、こうしておくと楽ちん。main()上記のようにしてあればファイルを指定するだけで実行できるようになる。おいて、もう一つ重要な概念がターゲットというもの。これは、タスクを実行した結果を永続化する先を表している。タスクをチェーンしていく場合、このターゲットを介してデータをやり取りする。一つ前のタスクが出力したターゲットの内容が、次のタスクの入力になるというわけ。ターゲットの指定がほとんど必須といってよいものになっている。これまでの例では指定してなかったけど、それは単にすごくシンプルだったので何とかなっていたに過ぎない。実際のところ、実行するときに次のような警告が出ていたのはターゲットを指定していなかったのが原因になっている。task.complete()次のサンプルコードでは、ターゲットとしてローカルディスクを指定している。いうターゲットを使う。いうメソッドをオーバーライドする。メソッドで得られるターゲットに対して実行結果を書き込む。main()それでは、上記を実行してみよう。今回は、先ほどは表示されていた警告が出ていない点に注目してほしい。いうファイルがディレクトリに作られている。タスクの実行結果を永続化する。テスト用途としてメモリをターゲットにする先ほどの例ではターゲットとしてローカルディスクを使った。ちなみに、テスト用途としてならターゲットをメモリにすることもできる。使うことで実行結果を保存する先をメモリにしている。main()念のため、先ほど出力されたファイルを削除した上で上記を実行してみよう。=====当然だけど、今度はファイルができない。directory複数のタスクをチェーンするこれまでの例では一つのタスクを実行するだけだった。現実世界の仕事では、タスクが一つだけということは滅多にないはず。使う魅力は半減してしまう。それ以上は細分化できないレベルまで仕事を小さくして、それをタスクに落とし込む。いうタスクをチェーンしている。いうメソッドをオーバーライドする。複数繰り返して出力する、というもの。main()上記を実行してみよう。=====すると、次のようにして実行結果のファイルが作られる。メソッドをオーバーライドせずに依存関係を表現することもできるにはできる。ターゲットを取得する方法。いえ、タスクの依存関係が分かりにくくなるので、使うのはなるべく避けた方が良い気がする。main()また、依存するタスクは一つとは限らない。メソッドの中でリストの形で依存するタスクを列挙する。一つずつ列挙していっても構わない。使うやり方だと、後から依存タスクの実行を並列化したいときも、必ず直列に実行されるようになるらしい。継承すると良いらしい。main()上記を実行してみよう。オプションを指定する。=====タスクにパラメータを受け取るタスクが動作するときに色々なパラメータを受け取りたい、という場面も多いはず。タスクで繰り返しの数をパラメータ化している。main()上記を実行する前に、先ほど生成されたファイルを削除しておく。これは、実行結果のファイルがあるときは実行がスキップされるため。この動作は何のターゲットを使っても基本的にそうなっている。repeating.txt実行してみよう。パラメータはコマンドラインから渡す。タスクはファイルがあるので実行されていないことが分かる。タスクのターゲットは、パラメータに応じて再実行された。実行結果があるときは実行をスキップするようになっている。そのため、途中でタスクが失敗したときも原因を取り除いて再実行したとき最小限の処理でやり直すことができる。特定期間のバッチ処理を実行する例えば、あるバッチ処理が毎日決まった時間に実行されているとしよう。それが、何らかの原因で失敗して、その日のうちに解決できなかったとする。こんなときは、基本的に失敗した日の内容も後からリカバーしなきゃいけない。当日以外のタスクを実行するというのは、そのように考えられて作っていないと意外と難しいもの。いったユースケースもカバーしやすいように作られている。次のようにして処理対象の日付を受け取って実行するようなタスクがあるとする。こんな風に、処理対象の日付を指定するように作っておくのはバッチ処理でよく使われるパターンらしい。生成されるターゲットのファイルに日付を含むようにしておくのもポイント。main()ひとまず、通常通り実行してみることにしよう。=====すると、実行結果のファイルが日付付きで作られる。このように日付を含むタスクを期間指定で一気に片付けるような方法が用意されている。オプションで実行したいタスクを指定する。オプションで指定する。=====すると、範囲内の日付でタスクが一気に実行される。すれば、実行結果のあるものについてはスキップされることから、まだ完了していないものだけを実行できる。一過性の問題で失敗していたとしても、翌日のバッチ処理などで自動的にリカバーされるというわけ。色々な外部コンポーネントやサービス、ライブラリと連携するための組み込みタスクが用意されている。