tryブロック内の処理
回答済みメールの送信元、本文、件名をトリガーにしたジョブフローを考えております。tryブロック内に処理を書き、正常に終了した場合とそうでない場合(STATUSが0か1か)で正しく処理できたか、処理に障害が発生したか分かるようにしております。
以下コード例
{ while(true) |
{ try |
<./mcha> ->
~~~
送信元を判定し、トリガーとするジョブフロー
処理
~~~
件名を判定し、トリガーとするジョブフロー
処理
~~~
本文を判定し、トリガーとするジョブフロー
処理
~~~
} =>
{ if $STATUS != 0 |
then:
print("処理中にエラーが発生しました。次のメール待ちです")->
print($DEBUG)
else:
print("処理が正常に完了しました。次のメール待ちです")
}
}
しかし、このままでは送信元、件名、本文すべてが引っかかった場合、同じ処理が3回行われてしまいます。こうならないように、例えば本文の時点で引っかかった場合は後の処理を行わずにSTATUS の判定へ飛びたいです。
どのようにすればいいか、お知恵をお貸しいただけないでしょうか
-
正式なコメント
フィックスポイント開発部の髙橋です。
メールチャネルでメールを受信して、件名や内容に応じた処理を実施したい、といった場面はよくあると思いますが、同じ処理が3回実行されてしまうのは避けたいですね。
ここで「〇〇を判定し、トリガーとするジョブフロー」とありますので、「条件を判定してマッチしたら対応する処理を実施する」ジョブフローを、送信元・件名・本文という判定対象ごとに3つ用意しておられるのかと想定します。
たとえば、送信元が特定のメールアドレスであれば、なんらかの処理を実施する、というジョブフローを以下のように考えてみます。
|mail|
{ if mail['From'] == 'kompira@example.com' |
print("送信元がマッチしました") ->
# 対応する処理を実施...
return(true)
}ここで、条件がマッチした場合に、対応する処理を実施後に return(true) しているのがポイントとなります。
同様に、件名や本文などについても、条件判定と対応する処理を記述したジョブフローを用意します。これらの条件判定と対応処理のジョブフローは、メインのジョブフローから呼び出すこととして、たとえば subjob1, subjob2, subjob3,... といった名前で作成することとします。
そのうえで、これらのサブジョブフローを順次呼び出して、条件判定をさせてマッチしたら次のサブジョブフローを呼び出さないようにすることを考えます。
以下に呼び出し元のメインのジョブフローの例を示します。
|mail = {From='', Subject='', Body=''}|
[subjobs = [./subjob1, ./subjob2, ./subjob3]] ->
{ try |
{ for subjob in subjobs |
[subjob: mail] ->
{ if $RESULT == true |
break
}
}
} =>
{ if $STATUS != 0 |
then:
print("処理中にエラーが発生しました。次のメール待ちです") ->
print($DEBUG)
else:
print("処理が正常に完了しました。次のメール待ちです")
}※ ここでは簡単のために、メールチャネルから繰り返しメールを受信してパースして、というところは省略して、パース済みのメールをパラメータで与えて、1回分だけ処理するようにしています。
サブジョブフローはこのジョブフローと同じディレクトリにある前提で、2行目で3つのジョブフローの参照を配列に格納しています。
4~5行目で、各サブジョブフローにメール情報をパラメータに与えて呼び出しています。
6~7行目で、あるサブジョブフローで条件にマッチして処理が実行されて場合、戻り値の true を判定して各サブジョブフローを呼び出す繰り返しを脱出しています。これにより、あるメールが複数の判定条件にマッチしても、最初にマッチした処理しか実行されないようになります。
3~10行目を try ブロックで囲っているため、サブジョブフロー内部でエラーが発生した場合に判定できます。
このように、同様の処理を行うサブジョブフローを配列に入れてループで呼び出すような場合、パラメータや戻り値の仕様、すなわちインターフェースを統一しておく必要があることにご注意ください。
参考になさってみてください。
以上、よろしくお願いいたします。
コメントアクション
サインインしてコメントを残してください。
コメント
2件のコメント