Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

ワークフロー・サンプルの紹介

この付録では、ENSDEMO ネームスペース内の Demo.Workflow パッケージに含まれているサンプルを紹介します。このサンプルを扱いやすくするために、この付録では、いくつかのセットアップ情報および留意事項に関する提案内容も掲載しています。この付録は以下の節で構成されています。

サンプルの概要

Demo.Workflow サンプルには、Demo.Workflow.HelpDeskOpens in a new tab というビジネス・プロセスが含まれています。このビジネス・プロセスは、問題レポートに必要な基本情報 (送信者名と問題の説明) が含まれた受信要求を受け取ります。アクションを求めるこの要求を受け取ると、HelpDesk は、いずれかのアクションによって問題が解決されるまで続けられる一連のアクションを開始します。

HelpDesk は、最初に問題レポートをタスクとして開発グループに送信します。このグループのメンバが問題が解決したことをレポートすると、HelpDesk は問題レポートにメモを追加し、それをタスクとしてテスト・グループに送信します。このグループのメンバが修正が十分であるとレポートすると、HelpDesk はレポートした問題が解決したことを示すフラグを付けて、発信者に最終的な応答を返信します。

セットアップ・タスク

このサンプルをセットアップして使用するには、以下の操作を行います。

  1. "Caché セキュリティ管理ガイド" の “ユーザ” の説明に従って、いくつかのユーザを作成します。

  2. "Ensemble の管理" の “ワークフロー・ロール、ワークフロー・ユーザ、およびワークフロー・タスクの管理” の説明に従って、これらのユーザのそれぞれをワークフロー・ユーザとして構成します。

  3. ENSDEMO ネームスペースで、Demo.Workflow.ProductionOpens in a new tab プロダクションを開始します。

    このプロダクションを開始すると、Demo-Development と Demo-Testing という 2 つのロールが自動的に作成されます(これらのロールが作成されるのは、このプロダクション内の 2 つのワークフロー・オペレーションに対して [自動作成ロール] 設定が有効になっているためです)。

  4. "Ensemble の管理" の “ワークフロー・ロール、ワークフロー・ユーザ、およびワークフロー・タスクの管理” の説明に従って、ワークフロー・ユーザをこれらのワークフロー・ロールに割り当てます。

    一部のユーザは両方のロールに割り当てることができます。

  5. Ensemble, テスト・サービス ページを使用して、以下の操作を行っていくつかのメッセージを HelpDesk に送信します。

    1. [Ensemble] をクリックして、[テスト] をクリックし、[ビジネス・ホスト] をクリックします。

    2. [ターゲットタイプ] で、[ビジネス・プロセス] をクリックします。

    3. [ターゲット名] で、HelpDesk をクリックします。

    4. [テスト] をクリックします。

    5. [報告者] フィールドと [問題] フィールドに適切な値を入力します。

    6. [テスト・サービスの呼び出し] をクリックします。

    いくつかのメッセージを送信して、このシナリオを対象にします。

  6. それぞれのユーザとして DeepSee ユーザ・ポータルにログインし、ワークフローの受信トレイを使用してタスクを管理します。

    まず Demo-Development ロールのユーザとしてログインして、いくつかのタスクを完了済みとしてマークします。これにより、追加のテスト・タスクが生成されます。次に Demo-Testing ロールのユーザとしてログインして、これらのテスト・タスクを完了済みとしてマークします。

    Tip:

    必要に応じて /csp/ensdemo という Web アプリケーションを構成して、このアプリケーションがパスワード認証を受け付ける一方で、認証なしのアクセスを受け付けないようにしてください。詳細は、"Caché セキュリティ管理ガイド" の “アプリケーション” を参照してください。

サンプル・リクエスト・メッセージ

以下の要求メッセージ・クラスは、サンプルのビジネス・プロセス HelpDesk に入る要求メッセージを定義します。このメッセージは顧客から送られた技術的な問題を表します。要求メッセージ・クラスの定義は以下のようになります。

Class Demo.Workflow.ProblemReport
{
/// Name of customer reporting the problem.
Property ReportedBy As %String(MAXLEN = 60);

/// Description of the problem.
Property Problem As %String(MAXLEN = 200);
}

ビジネス・プロセス・クラスのサンプル

Demo.Workflow.ProblemReportOpens in a new tab 要求メッセージを受け取ると、BPL ビジネス・プロセスのサンプルの Demo.Workflow.HelpDeskOpens in a new tab は、いずれかのアクションによって問題が解決されるまで続けられる一連のアクションを開始します。

HelpDesk ビジネス・プロセスは while ループで構成されます。問題レポートはこのループ内で、まず、問題を修正するために開発( グループへ、次に修正をテストするためにテスト・グループへ送信されます。この一連のアクションが完了するとすぐ、while 条件 “Resolved” が満たされ、ビジネス・プロセスが終了し、最終的な応答が呼び出し側に返されます。

ビジネス・プロセス・デザイナで表示した場合、HelpDesk ビジネス・プロセスは次のように表示されます。

generated description: busproc bpl

展開された while ループの上部は、以下のように表示されます。

generated description: busproc bpl expanded top

下部は以下のとおりです。

generated description: busproc bpl expanded bottom

While ループ内のコードは、ワークフローに対して 2 つの呼び出しを実行します。各呼び出しには、組み込みタスク要求クラスおよびタスク応答クラスが使用されます。2 つの <call> 要素の違いは、次のように BPL ソース・コード内で簡単に確認できます。

Class Demo.Workflow.HelpDesk Extends Ens.BusinessProcessBPL 
{

XData BPL
{
<process request='Demo.Workflow.ProblemReport'
         response='Ens.Response' >
  <context>
    <property name='Resolved' type='%Boolean' initialexpression='0' />
    <property name='DevelopmentAction' type='%String' />
    <property name='TestingAction' type='%String' />
  </context>

  <sequence>
    <while name='while'
           condition='context.Resolved=0' >
      <annotation>
        Work on this problem until it is resolved.
        (Click on the loop icon to see details of this while loop.)
      </annotation>

      <call name='Notify Development'
            target='Demo-Development'
            async='1' >
        <annotation>
          Send the problem report to Development for review.
        </annotation>
        <request type='EnsLib.Workflow.TaskRequest' >
          <assign property='callrequest.%Actions'
                  value='"Corrected,Ignored"'
                  action='set' />
          <assign property='callrequest.%Subject'
                  value='"Problem reported by "_request.ReportedBy'
                  action='set' />
          <assign property='callrequest.%Message'
                  value='request.Problem'
                  action='set' />
          <assign property='callrequest.%FormFields'
                  value='"Comments"'
                  action='set' />
        </request>
        <response type='EnsLib.Workflow.TaskResponse' >
          <assign property='context.DevelopmentAction'
                  value='callresponse.%Action'
                  action='set' />
        </response>
      </call>

      <sync name='WaitForDevelopment' calls='Notify Development' type='all' />

      <if name='Fixed?' condition='context.DevelopmentAction="Corrected"' >
        <annotation>
          If Development fixed the problem, test it.
        </annotation>

        <true>
          <call name='Notify Testing'
                target='Demo-Testing'
                async='1' >
            <annotation>
              Send the problem to Testing for confirmation.
            </annotation>
            <request type='EnsLib.Workflow.TaskRequest' >
              <assign property='callrequest.%Actions'
                      value='"Corrected,Retest"'
                      action='set' />
              <assign property='callrequest.%Subject'
                      value='"Test this problem from "_request.ReportedBy'
                      action='set' />
              <assign property='callrequest.%Message'
                      value='request.Problem'
                      action='set' />
            </request>
            <response type='EnsLib.Workflow.TaskResponse' >
              <assign property='context.TestingAction'
                      value='callresponse.%Action'
                      action='set' />
            </response>
          </call>

          <sync name='WaitForTesting' calls='Notify Testing' type='all' />

          <if name='Corrected?' condition='context.TestingAction="Corrected"' >
            <annotation>Has the problem been corrected?</annotation>
            <true>
              <assign name='Resolved'
                      property='context.Resolved'
                      value='1'
                      action='set' />
            </true>
          </if>
        </true>

        <false>
          <assign name='Not a problem'
                  property='context.Resolved'
                  value='1'
                  action='set' />
        </false>

      </if>
    </while>
  </sequence>
</process>
}
}

コントロール・フローのサンプル

プロダクションの実行中、サンプルの BPL ビジネス・プロセス Demo.Workflow.HelpDeskOpens in a new tab は以下のように機能します。このコントロール・フローの手順を、前の節で示した BPL ソース・コードで対応している文と比較してみてください。

  1. メッセージ・タイプ Demo.Workflow.ProblemReportOpens in a new tab によって、問題の報告者がビジネス・プロセスに伝えられ、問題を説明する簡単なテキスト文字列が表示されます。これら 2 つのプロパティの値は、このビジネス・プロセスを呼び出すビジネス・ホストによって提供されます。

  2. Demo-Development ワークフロー・オペレーションへの <call> の準備に当たり、Demo.Workflow.HelpDeskOpens in a new tab ビジネス・プロセスは受信要求プロパティ ReportedBy および Problem を使用して、タスク要求フィールド %Subject および %Message にそれぞれ入力します。これ以外の 2 つの組み込みタスク・プロパティも機能を開始します。この call は、%Actions フィールドに Corrected,Ignored の値を割り当てることによって、実行可能なユーザ・アクションのリストを作成します。また、呼び出しはこのタスクを確認するユーザがデータを入力できるように、Comments と呼ばれるフォーム・フィールドも用意します。

  3. ビジネス・プロセスは、Demo-Development への <call> を非同期で作成し、タスク応答をキャッチするための <sync> 要素を設定します。

  4. ワークフロー・エンジンは、タスクを Demo-Development ワークフロー・ロールの各ワークフロー・ユーザと関連付けます。

  5. ワークフロー・ユーザの 1 人がタスクを受け入れます。ワークフロー・エンジンはそのユーザにタスクを割り当てます。

  6. 割り当てられたユーザは、[コメント] フィールドを編集し、アクション [修正されました] または [無視されました] のいずれかをクリックします。

  7. タスク応答が返されます。その %Action フィールドには、タスクを完了したユーザ・アクションの値が含まれます ([修正されました] または [無視されました])。ビジネス・プロセスは、DevelopmentAction と呼ばれる実行コンテキストのプロパティにこの値を保存します。

  8. ビジネス・プロセスは、DevelopmentAction 値をテストするために、<if> 要素を使用します。結果は以下のとおりです。

    • DevelopmentAction[修正されました] の場合、この値はヘルプ・デスクのビジネス・プロセスに、その <if> 要素の <true> 部分を実行する必要があることを知らせます。<true> 要素は、次の手順に示すように、Demo-Testing ワークフロー・ロールへの <call> を発行します。

    • DevelopmentAction[修正されました] ではない場合、この値はヘルプ・デスクのビジネス・プロセスに、BPL ソース・コードの最後の方にある、その <if> 要素の <false> 部分を実行する必要があることを知らせます。ユーザによって DevelopmentAction無視 されると、コントロールはこの文に至ります。ビジネス・プロセスは、その呼び出し側に最終的な応答を返し、報告された問題は Not a problem であるとコメントして、ブーリアン応答値 Resolved を 1 (真) に設定します。

  9. Demo-Testing ワークフロー・オペレーションへの <call> の準備に当たり、ビジネス・プロセスは元の受信要求プロパティ ReportedBy および Problem を使用して、タスク要求フィールド %Subject および %Message にそれぞれ入力します。ただし、前の <call> とは異なり、Demo-Testing への <call> には定義されたフォーム・フィールドはありません。また、実行可能なユーザ・アクションのリストが異なります。相違点は %Actions にあります。この <call> で %Actions フィールドに割り当てられる値は Corrected,Retest です。

  10. ビジネス・プロセスは、Demo-Testing への <call> を非同期で作成し、タスク応答をキャッチするための <sync> 要素を設定します。

  11. ワークフロー・エンジンは、タスクを Demo-Testing ワークフロー・ロールの各ワークフロー・ユーザと関連付けます。

  12. ワークフロー・ユーザの 1 人がタスクを受け入れます。ワークフロー・エンジンはそのユーザにタスクを割り当てます。

  13. 割り当てられたユーザは、[修正されました] または [再テスト] をクリックします。

  14. タスク応答が返されます。その %Action フィールドには、タスクを完了したユーザ・アクションの値が含まれます ([修正されました] または [再テスト])。ビジネス・プロセスは、TestingAction と呼ばれる実行コンテキストのプロパティにこの値を保存します。

  15. ビジネス・プロセスは、TestingAction 値をテストするために、<if> 要素を使用します。結果は以下のとおりです。

    • TestingActionCorrected の場合、ビジネス・プロセスはその呼び出し側に最終的な応答を返し、報告された問題は Resolved であるとコメントして、ブーリアン応答値 Resolved を 1 (真) に設定します。

    • TestingActionCorrected ではない場合、ブーリアン応答値 Resolved は初期値の 0 (偽) のままです。ビジネス・プロセスは再度 <while> ループの先頭に入ります。

ダッシュボードとメトリック

ビジネス・メトリックとダッシュボードが連携してワークフロー・ロール統計を表示する様子を確認するには、スタジオを使用して、ENSDEMO ネームスペースのサンプル・クラス Demo.Workflow.WFMetricOpens in a new tabDemo.Workflow.DashboardOpens in a new tab を表示します。

以下のビジネス・メトリック・クラス Demo.Workflow.WFMetricOpens in a new tab のサンプル・コードは、3 つの使用可能な統計メソッドを呼び出して、戻り値をメトリック・プロパティに割り当てています。次の付録では、使用可能なメソッドについて説明しています。

/// Sample business metric class for Workflow demo
Class Demo.Workflow.WFMetric Extends Ens.BusinessMetric
{

/// Active Tasks
Property ActiveTasks As Ens.DataType.Metric(AUTOHISTORY = 10, RANGELOWER = 0,
                                     RANGEUPPER = 50, UNITS = "Tasks")
                                     [ MultiDimensional ];

/// Active Load
Property Load As Ens.DataType.Metric(AUTOHISTORY = 10, RANGELOWER = 0,
                                     RANGEUPPER = 100, THRESHOLDUPPER = 90,
                                     UNITS = "%") [ MultiDimensional ];

/// Completed Tasks (since previous day)
Property CompletedTasks As Ens.DataType.Metric(AUTOHISTORY = 10, RANGELOWER = 0,
                                     RANGEUPPER = 100, UNITS = "Tasks")
                                     [ MultiDimensional ];

/// Calculate and update the set of metrics for this class
Method OnCalculateMetrics() As %Status
{
  // set the values of our metrics
  // %Instance is the current instance (RoleName in this case)
  Set tRole = ..%Instance

  Set ..ActiveTasks = ##class(EnsLib.Workflow.Engine).BamActiveTasks(tRole)
  Set ..Load = ##class(EnsLib.Workflow.Engine).BamActiveLoad(tRole)

  // Get task since start of previous day
  Set tStart = $ZDT($H-1,3)

  Set ..CompletedTasks =
      ##class(EnsLib.Workflow.Engine).BamCompletedTasks(tRole,tStart)

  Quit $$$OK
}

/// Set of instances for this metric class
/// There is one instance for every defined role.
Query MetricInstances() As %SQLQuery
{
  SELECT Name FROM EnsLib_Workflow.RoleDefinition
}

}

ここで使用されている ObjectScript 関数 $ZDT ($ZDATETIME) と $H ($HOROLOG) については、"Caché ObjectScript リファレンス" の “ObjectScript 関数” の章を参照してください。

FeedbackOpens in a new tab