トレーニングと『DataSpiderガイドブック』によって、DataSpiderの基本的な使い方やスクリプトの使い方を身に付けた東谷君。
さっそく、実際の業務でのスクリプト開発者として神尾みかさん率いる開発第二チームのプロジェクトに参画することになった。
意気揚々とスクリプト開発に挑む東谷君は、早速悩みに突き当たってる様子だ。
エラーが発生しても処理を継続したい!
東谷君:
ミカさん、ちょっと悩んでいるがありまして。教えてもらって良いですか?
ミカさん:
どうしたの?
東谷君:
データベースのテーブルからデータを読んで、Mapperでマッピングして他のテーブルに書き込むスクリプトを作ってるんですね。
でもどうやらネットワークの安定性がイマイチみたいで、DBへの接続がごくたまに瞬断されるんですよ。
ミカさん:
ふんふん。
東谷君:
DBのテーブルからデータを読み取るときに瞬断が発生して失敗した場合は、もう一度処理をリトライすれば正常に実行できます。
なので、「特定のエラーの場合だけ処理をリトライする」という処理を作りたいと思うんですけど、どうすればいいのか・・・。
ミカさん:
フフフ、まだまだDataSpider1年生ね・・・・。
まず最初にやりたいのは、「エラーが発生しても処理を続行する」っていうことね。
その場合使うコンポーネントは何かしら?
東谷君:
あ、「例外監視処理」ですね! それでエラーをキャッチして・・・
でもどうやってテーブル読み取り時のネットワーク瞬断だけを検知すればいいのか・・・・
そもそもリトライはどうやってやればいいのか・・・
あわわわわわわわわ
ミカさん:
落ち着いて!
東谷君:
はい・・・
特定の処理の特定のエラーだけを判別するには
ミカさん:
処理が複雑になりそうなときは、全部一緒に考えずに要件を整理して、それぞれを実現する機能を考えてみましょう。
1 ) 「テーブル読み取り」-「Mapper」-「テーブル書き込み」の処理で、エラーが発生しても処理を続行したい
(※) 処理を続行するのは、テーブル読み取り処理で「ネットワークの瞬断」エラーが発生した場合のみ
2) 処理を続行した場合、再びテーブル読み取り処理からリトライする
だいたいやりたいのはこういうことね。
東谷君:
おお! なるほど。ではまずは1のことを考えてみます。テーブル読み書きの処理をまとめて「例外監視処理」で囲って・・・。]
あ、そういえば「例外監視処理」の「例外処理」には、チェック対象を選択できるんでしたよね。
これで「テーブル読み取り処理」だけをチェック対象にすればいいのか!
みかさん:
お、その調子!
東谷君:
そうすると問題は”ネットワークの瞬断エラーが発生した場合”を切り分ける方法ですね。
うーんどうすればいいのか。
みかさん:
その場合、どういうエラーが発生するかの情報はある? それがあれば・・・・。
東谷君:
ちょっと待ってくださいね・・・・あ、これだ、「Connection reset by peer」。このメッセージがエラーのトレースに出る・・・・ということは、このエラーが発生した場合はこうする・・・というフローにすれば・・・ここで「条件分岐処理」か!
みかさん:
そう! この「テーブル読み取り処理」のコンポーネント変数「error_trace」にエラーのトレース情報が格納されるのよ。
これを条件分岐の条件でそのメッセージが含まれるかどうか判断すれば、作りたいフローが作れるのよ。
東谷君:
こういう感じですね。
みかさん:
そうそう。これで、それ以外のエラーの場合はエラーを再び投げて、処理を中断させればいいわね。
リトライどうする!? そして謎の声
みかさん:
次は「処理を続行した場合、再びテーブル読み取り処理からリトライする」というところね。
これに関してはいろいろなやり方があると思うけど、何かアイディアあるかしら?
東谷君:
うーん、単純にコピー&ペーストで同じ処理を複製して、繋いでもできそうですけど、もうちょっとスマートにできそうですね。
同じテーブル再読み取りに戻るのは・・・「繰り返し処理」をうまく使えないかな。
みかさん:
いいところまで来てる!
ちょっと待ってね、呼ぶわ。
東谷君:
(呼ぶ? 誰を?)
くも子:
・・・「繰り返し(条件指定)処理」とスクリプト変数を組み合わせるといいクモ!・・・
みかさん:
だそうよ。
東谷君:
なるほどー。「繰り返し(条件指定)処理」とスクリプト変数を組み合わせると・・・って今聞こえてきた声何!?
みかさん:
フフフ・・・くも子の声を自在に聞けるようになるとDataSpiderの・・・おっとこれ以上は言ってはいけないわ。仕事を進めましょう。
東谷君:
(何なんだ・・・) は、はい。
みかさん:
「繰り返し(条件指定)処理」は、特定の条件の場合だけ繰り返すという条件を設定できる繰り返し処理ね。
東谷君:
つまり、先ほど作ったフローを通った場合だけ繰り返す、という条件を作ればいいわけですね。
そうか! そこでスクリプト変数を使うわけですね。
みかさん:
そう! この条件分岐を通った場合だけ、スクリプト変数「繰り返し確認」に、変数Mapperを使用してその条件に特定の値を渡すのよ。
そうね、とりあえず「-1」を渡すようにしてみようかしら。
そして、その後に「continue処理」を配置して、「繰り返し(条件指定)開始」アイコンに戻るようにすると。
東谷君:
じゃあ、テーブル書き込みまで成功した場合は「0」を渡しますか。
あとやることは、
くも子:
(・・・「繰り返し(条件指定)処理」で、"変数「繰り返し確認」 が「0」と等しくない"という条件を設定するクモ!・・)
東谷君:
ってわけで、繰り返し条件を指定すれば・・・・できた! ってまた!?
みかさん:
おめでとう! 東谷君もDataSpiderの心がだいぶん分かってきたようね・・・というわけで詳しくは次回以降で明かされる、かもしれないわ。
ちなみに今回のスクリプトは、スキルアップセンターのサンプルスクリプトからダウンロードできるので、ぜひ触ってみたい方は使ってみてください!
東谷君:
もはや誰に向けて話しているんだかよくわかりませんが、ありがとうございました!
DataSpiderマスターへの道を一歩踏み出した東谷君。
いろいろな謎を残しつつ、次回以降もさまざまなスクリプトをみかさんとくも子と一緒に作っていく予定です。
お楽しみに!
なお、今回作成したスクリプトは、以下スキルアップセンターのページよりダウンロードが可能です。
スキルアップセンター > サンプルスクリプトのダウンロード > 特定のエラーの場合は処理をリトライする
(※) ダウンロードするためにはログインが必要です