tryブロック内の処理

回答済み

コメント

2件のコメント

  • 正式なコメント
    Ichiro Takahashi

    フィックスポイント開発部の髙橋です。

    メールチャネルでメールを受信して、件名や内容に応じた処理を実施したい、といった場面はよくあると思いますが、同じ処理が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 ブロックで囲っているため、サブジョブフロー内部でエラーが発生した場合に判定できます。

    このように、同様の処理を行うサブジョブフローを配列に入れてループで呼び出すような場合、パラメータや戻り値の仕様、すなわちインターフェースを統一しておく必要があることにご注意ください。

    参考になさってみてください。

    以上、よろしくお願いいたします。

    コメントアクション Permalink
  • 中島

    期待通りの動作ができそうです。

    ありがとうございました

    0
    コメントアクション Permalink

サインインしてコメントを残してください。