Orchestrator
v2023.4
Managing Jobs - Standalone 2023.4
Banner background image
ロゴ
Orchestrator ユーザー ガイド
最終更新日 2023年12月6日

ジョブを管理する

ジョブを開始する

以下の手順を実行する前に、プロセスを作成する必要があります。

  1. プロセスが存在するフォルダーから [オートメーション] > [ジョブ] に移動します。
  2. [開始] をクリックします。[ジョブを開始] ウィンドウが表示されます。
  3. [プロセス名] ドロップダウンで、現在のフォルダーにあらかじめデプロイしておいたプロセスを選択します。
  4. 必要に応じて、以下のセクションで概説しているようにフィールドを設定します。
  5. [開始] をクリックします。[ジョブを開始] ウィンドウが閉じ、現在アクティブなフォルダーに利用可能なランタイムがある場合は、設定に従ってロボットでジョブが開始されます。ジョブの [ステート] は、リアルタイムで [ジョブ] ページに表示されます。

ジョブの優先度を設定する

実行されるジョブの優先度を、プロセス レベルで設定された優先度とは異なる値にする必要がある場合は、[ジョブの優先度] ドロップダウンから優先度を選択します。このフィールドには、パッケージから継承された優先度が自動的に入力されます。

実行ランタイムを選択する

[ランタイムの種類] ドロップダウンから、ジョブの実行に使用するランタイムの種類を選択します。

ドロップダウンの下には、利用可能なランタイムと接続済みのランタイムの数が表示されます。

  • _ 利用可能 - 利用可能なランタイムの数。ランタイムの総数から実行中のジョブの数を引いた値です。
  • _ 接続済み - ランタイムの総数。アクティブ フォルダーに関連付けられた Orchestrator に接続されたすべてのマシン上のランタイムの合計です。

    ランタイムの種類

    説明

    Production (Unattended)

    ジョブは Unattended ランタイムを使用して、無人モードで実行されます。

    テスト

    ジョブは Testing ランタイムを使用して、無人モードで実行されます。

    NonProduction

    ジョブは NonProduction ランタイムを使用して、無人モードで実行されます。

    Cloud - Serverless Testing

    ジョブは、テスト環境で実行するように構成されたサーバーレスのロボット端末上で、無人モードで実行されます。必要なロボット ユニットの数はテスト環境専用です。これは、サーバーレス ロボットのマシンのサイズと、ジョブの実行に要する時間 (分) によって異なります。

    詳しくは、こちらのページの「ロボット ユニット - 消費」セクションをご覧ください。

    Cloud - Serverless

    ジョブは、運用環境で実行するように構成されたサーバーレスのロボット端末上で、無人モードで実行されます。必要なロボット ユニットの数は運用環境専用です。これは、サーバーレス ロボットのマシンのサイズと、ジョブの実行に要する時間 (分) によって異なります。

    詳しくは、こちらのページの「ロボット ユニット - 消費」セクションをご覧ください。

    Cloud - VM Testing

    ジョブは、テスト環境または非運用環境で実行するように構成されたクラウドの仮想マシン上で、無人モードで実行されます。仮想マシンを実行すると、テスト環境用のロボット ユニットが消費されます。

    詳しくは、こちらのページの「ロボット ユニット - 消費」セクションをご覧ください。

    Cloud - VM

    ジョブは、運用環境で実行するように構成されたクラウドの仮想マシン上で、無人モードで実行されます。仮想マシンを実行すると、運用環境用のロボット ユニットが消費されます。

    詳しくは、こちらのページの「ロボット ユニット - 消費」セクションをご覧ください。

: マシン テンプレート A に NonProduction のランタイムが 2 つと Unattended のランタイムが 1 つあり、マシン テンプレート B に NonProduction のランタイムが 3 つと Unattended のランタイムが 2 つあるとします。いずれのマシン テンプレートも 1 つのフォルダーに関連付けられています。各テンプレートで、1 つのホスト マシンを接続します。すると、ランタイムのステートは次のようになります。

  • Unattended: 3 Available, 3 Connected
  • NonProduction: 5 Available, 5 Connected

ランタイムを占有するジョブが実行されると、その種類のジョブで利用可能なランタイム数が 1 つ減ります。

注:

パブリッシュ時には、ジョブを実行するために利用可能なランタイムが個人用ワークスペースから選択されます。ランタイムの優先順位は次のとおりです。

  • サーバーレス (Automation Suite の Orchestrator でのみ利用可能)
  • Production (Unattended)
  • NonProduction

たとえば、個人用ワークスペースに Serverless ランタイムが存在しない場合、利用可能な Production ランタイムが使用されます。そのランタイムも存在しない場合は、利用可能な NonProduction ランタイムが使用されます。どのランタイムも存在しない場合、ジョブは失敗します。

選択したランタイムがジョブの実行の合間に利用できなくなった場合、Orchestrator では次に利用可能なランタイムが検索されないため、後続のジョブの実行は失敗します。

実行ターゲットを設定する

[実行ターゲット] タブで、必要に応じて以下のオプションを設定して、実行ターゲットを設定します。



動的に割り当て

アカウントとマシンが明示的に選択されていない動的割り当てでは、最初に利用可能になったアカウントとマシンで、フォアグラウンド プロセスを複数回実行できます。バックグラウンド プロセスは、ビジーであるかどうかにかかわらず、任意のアカウントによって実行されます (十分な数のランタイムがある場合)。

このオプションを使用すれば、1 つのジョブでプロセスを最高 10,000 回実行できます。

アカウント

以下の方法のいずれかを選択できます。

  • アカウントを指定すると、プロセスはその特定のユーザー アカウントまたはロボット アカウントの下で実行されます。
  • アカウントとマシンの両方を指定すると、ジョブはそのアカウントとマシンのペアで開始されます。有効なアカウントとマシンのペアのみ選択できます。
  • アカウントを指定しない場合、Orchestrator はアカウントを動的に割り当てます。

マシン

以下の方法のいずれかを選択できます。

  • マシン オブジェクトを指定すると、プロセスは、選択したマシン テンプレートに接続されたいずれかのホスト マシンで実行されます。[接続済みのマシン] フィールドで、接続済みのホスト マシンのプールから特定のホスト マシンを選択します。
  • アカウントとマシンの両方を指定すると、ジョブはそのアカウントとマシンのペアで開始されます。有効なアカウントとマシンのペアのみ選択できます。
  • マシンを指定しない場合、Orchestrator はホスト マシンを動的に割り当てます。

ジョブの種類に一致したランタイムが、関連するマシン テンプレートに割り当てられていることを確認してください。アクティブなフォルダーに関連付けられた、接続済みのホスト マシンだけが表示されます。

有効なアカウントとマシンのマッピングを選択

ジョブを実行する特定のアカウントとマシンのペアを選択します。
docs image
ジョブを複数のペアで実行する場合は、[アカウントとマシンのマッピングを追加] をクリックできます。その場合、アカウントとマシンのペアごとに保留中のジョブが作成されます。
注: これは、テナント設定の [全般] タブで [ユーザーとマシンのマッピングを有効化] オプションが選択されている場合にのみ機能します。

ジョブの再開時にアカウントとマシンの割り当てを維持する

このフィールドでは、長期実行ジョブの異なるフラグメントを同じアカウントとマシンのペアで実行するかどうかを設定できます。

既定では、中断されているジョブはその時点で利用可能な任意のロボットとマシンで再開されます。

ライセンスまたはリソースの要件に基づいて、ジョブを開始したマシンおよびアカウント コンテキストでジョブを再開できます。

ジョブを実行するのに、SAP ライセンスが必要だとします。その場合、利用可能なマシンごとに SAP ライセンスをインストールするのではなく (コストが増加)、ライセンスを 1 つのマシンにインストールし、そのマシンを使用してジョブを開始および再開することができます。同じ方法を、ユーザー ライセンスでも使用できます。つまり、1 つのユーザー ライセンスのみを割り当て、そのライセンスを使用してジョブを実行することができます。

ジョブの実行を終了するスケジュールを設定

プロセスの実行時に障害が発生し、ジョブが保留ステートのままになってしまうことがあります。このトグルをオンにすると、以下を実行できます (クリックして展開)。

  • ドロップダウン メニューから [停止] を選択 - ジョブが「保留中」ステートになってから指定した期間が経過した後に、実行の正常終了を試行します (期間を最短 1 分、最長 10 日、1 日は 23 時間 59 分として設定)。


  • ドロップダウン メニューから [強制終了] を選択 - ジョブが「保留中」ステートになってから指定した期間が経過した後に、実行の強制終了を試行します (期間を最短 1 分、最長 10 日、1 日は 23 時間 59 分として設定)。


  • ドロップダウン メニューから [停止] を選択して [ジョブが停止しない場合に自動的に強制終了するスケジュールを設定] オプションをオン - ジョブが「保留中」ステートになってから指定した期間が経過した後に、実行の正常終了を試行します。その後、ジョブが「停止中」ステートになってから指定した期間が経過した後に、実行の強制終了を試行します (期間を最短 1 分、最長 10 日、1 日は 23 時間 59 分として設定)。


ジョブが保留中または再開ステータスのままになっている場合にアラートを生成

このトグルをオンにすると、指定した期間より長く保留中または再開ステータスに留まっているジョブに関するアラートがアクティブ化されます。

設定可能な期間は、最小で 1 分、最大で 11 日です。

ジョブが設定された期間を超えた場合、重要度が「Error」のアラートがポップアップで表示され、以下のテキストによって通知されます。

「N jobs for #process {process_number} have been pending or resumed for more than X hours and Y minutes. (#プロセス {process_number} の N 個のジョブが、X 時間 Y 分を超えて保留中または再開ステータスのままです。)」各項目の説明:

  • N - アラートをトリガーしたジョブの数です。
  • {process_number} - プロセス識別子です。
  • X - ジョブが保留中または再開ステータスの間に設定値を超えた時間数です。日は時間に変換されます。

  • Y - ジョブが保留中または再開ステータスの間に設定値を超えた分数です。

開始済みのジョブが完了していない場合にアラートを生成

このトグルをオンにすると、指定した期間内に完了しないジョブに関するアラートがアクティブ化されます。

設定可能な期間は、最小で 1 分、最大で 11 日です。

ジョブが設定された期間を超えた場合、重要度が「Error」のアラートがポップアップで表示され、以下のテキストによって通知されます。

「Job for #process {process_number} has been pending been running for more than X hours and Y minutes. (#プロセス {process_number} のジョブが、X 時間 Y 分を超えて実行されています。)」各項目の説明:

  • {process_number} - プロセス識別子です。
  • X - ジョブが完了試行中に設定値を超えた時間数です。日は時間に変換されます。

  • Y - ジョブが完了試行中に設定値を超えた分数です。

Orchestrator では、無効な設定でジョブを開始することはできません。無効な設定でジョブを開始しようとすると、設定の修正方法を詳しく示したエラー メッセージが表示されます。



動的な割り当てを使用してジョブを開始すると、つまりマシンまたはアカウントが指定されておらず、フォルダーの設定がジョブの実行に対応していない状態でジョブを開始すると、エラーが発生します。その場合は、設定を修正してください。そうしないと、ジョブは保留中のままになります。たとえば、フォルダーにクロスプラットフォーム テンプレートしかない場合に .NET Framework 4.6.1 のバックグラウンド ジョブを実行しようとしても、うまくいきません。設定が修正されるまで、ジョブは保留中になるためです。

引数を追加する

[引数] タブに、選択したプロセスの入力引数を入力します。このタブには、選択したプロセスで受け付けられるすべての入力引数が自動的に入力され、対応する値がパッケージから継承されます。

API トリガーでジョブを開始する

お好きなサードパーティ アプリケーションから、API トリガーを介してジョブを開始できます。次の手順を実行します。

  1. 実行するプロセスに基づいて API トリガーを作成します。ジョブを開始するために必要な URL が生成されます。これを実現するには、このトピックの指示に従ってください。
  2. 専用の個人用アクセス トークンを作成し、必要なリソースへのアクセス権を付与します。この操作は、組織レベルの設定ページの、[個人用アクセス トークン] ページで行います。PAT は一度しか表示されないため、保存したら必ずコピーしてください。
  3. ベアラー トークン フィールドに個人用アクセス トークンを貼り付けて、要求を承認します。
  4. トリガーのリストで目的のテナントの横にある [完全なスラグ URL をコピー] オプションをクリックしてジョブの URL を取得し、それをお使いのツールに貼り付けます。
  5. 必要に応じて引数を設定します。

    引数は次のように入力できます。

    クエリ文字列パラメーター

    スラグ hw-process を使用し、引数 filesfolders を持つジョブの場合、コマンド ラインで使用できる cURL は次のようになります。
    curl --location --request POST 'https://{yourDomain}/t/6ea73196-ca89-446c-81e1-5279bdd36dc2/hw-process?argument1=files&argument2=folders' \
    --header 'Cookie: __cf_bm=_5E_r3oulk6zLCr6.CUij.RFN4lCeTgYMR31gradWtI-1697542233-0-AdP+xhO+SE5PQ6wnoEum5qRu4wzUgGgOrezRhHrR4dcVvhsvl9yV/V3KAFhi/TmomqMtmxc426WT83lDMoL1seQ='curl --location --request POST 'https://{yourDomain}/t/6ea73196-ca89-446c-81e1-5279bdd36dc2/hw-process?argument1=files&argument2=folders' \
    --header 'Cookie: __cf_bm=_5E_r3oulk6zLCr6.CUij.RFN4lCeTgYMR31gradWtI-1697542233-0-AdP+xhO+SE5PQ6wnoEum5qRu4wzUgGgOrezRhHrR4dcVvhsvl9yV/V3KAFhi/TmomqMtmxc426WT83lDMoL1seQ='

    フォーム データ

    スラグ hw-process を使用し、引数 filesfolders を持つジョブの場合、コマンド ラインで使用できる cURL は次のようになります。
    curl --location 'https://{yourDomain}/t/6ea73196-ca89-446c-81e1-5279bdd36dc2/hw-process' \
    --header 'Cookie: __cf_bm=_5E_r3oulk6zLCr6.CUij.RFN4lCeTgYMR31gradWtI-1697542233-0-AdP+xhO+SE5PQ6wnoEum5qRu4wzUgGgOrezRhHrR4dcVvhsvl9yV/V3KAFhi/TmomqMtmxc426WT83lDMoL1seQ=' \
    --form 'argument1="files"' \
    --form 'argument2="folders"'curl --location 'https://{yourDomain}/t/6ea73196-ca89-446c-81e1-5279bdd36dc2/hw-process' \
    --header 'Cookie: __cf_bm=_5E_r3oulk6zLCr6.CUij.RFN4lCeTgYMR31gradWtI-1697542233-0-AdP+xhO+SE5PQ6wnoEum5qRu4wzUgGgOrezRhHrR4dcVvhsvl9yV/V3KAFhi/TmomqMtmxc426WT83lDMoL1seQ=' \
    --form 'argument1="files"' \
    --form 'argument2="folders"'

    JSON の本文テキスト

    スラグ hw-process を使用し、引数 filesfolders を持つジョブの場合、コマンド ラインで使用できる cURL は次のようになります。
    curl --location 'https://{yourDomain}/t/6ea73196-ca89-446c-81e1-5279bdd36dc2/hw-process' \
    --header 'Content-Type: application/json' \
    --data '{
        "argument1" = "files"
        "argument2" = "folders"
    }
    'curl --location 'https://{yourDomain}/t/6ea73196-ca89-446c-81e1-5279bdd36dc2/hw-process' \
    --header 'Content-Type: application/json' \
    --data '{
        "argument1" = "files"
        "argument2" = "folders"
    }
    '

    引数は、前述の方法を組み合わせて入力することもできます。

  6. ジョブを実行します。

    トリガー定義で選択した呼び出しモードに応じて、ジョブは次のいずれかの方法で実行されます。

    • 非同期ポーリング

    • 非同期で完了を待たずに実行 (fire & forget)

    • 同期 (ロングポーリング)

    ただし、$callMode パラメーターを使用すると、クエリ文字列または本文内で呼び出しモードを上書きできます。

    これらのオプションについて詳しくは、「呼び出しモードの説明」セクションをご覧ください。

呼び出しモードの説明

API トリガーの呼び出しモードは、Orchestrator でジョブの実行を作成および追跡するために特別に設計されています。

HTTP ベースの通信の根本的な課題として、本質的に同期的である、ということがあります。通常、クライアントは要求を送信し、サーバーからの応答を待ちます。しかしロボットのジョブのコンテキストにおいては、ジョブが完了するまで接続を開いたままにすることが Orchestrator でサポートされていません。

この問題を解決するために、HTTP プロトコルを使用して複数の呼び出しモードをモデル化しました。これらのモードは、標準のHTTPメソッド、ステータス コード、ヘッダーに依存して、システム内のジョブを作成および監視し、その結果を取得します。このため、接続を不必要に開いたままにすることがありません。ここで提案している呼び出しモードには、それぞれ長所と短所があるため、ご自身の連携のニーズに最適なモードを選択してください。ただし、セキュリティで保護された通信を確保するために、各呼び出しでベアラー トークンを通じた適切な認証が求められることにご注意ください。

非同期ポーリング

この呼び出しモードでは、設定済みの HTTP 動詞で呼び出しを行って新しいジョブをトリガーし、ステータスの URI を受け取ります。その後のステータス URI は、ジョブが完了するまで手動でポーリングする必要があります。この時点で呼び出しが別のエンドポイントにリダイレクトされます。このエンドポイントを使用して、ジョブの結果 (出力またはエラー) が取得されます。

非同期ポーリング ワークフロー。ジョブの完了は、応答場所に対する手動の中間呼び出しに依存する

docs image

最初の呼び出しは、設定済みの HTTP 動詞 (GET、POST、PUT、DELETE) を使用して行われ、関連するジョブが Orchestrator 内に作成されます。ジョブが正常に作成されると、システムは HTTP ステータス コード 202 (Accepted) と Location ヘッダー内のステータス URI で応答します。

ジョブが作成されたら、定期的にステータスをポーリングする必要があります。このポーリング プロセス中は、ジョブが実行されている限り、ステータス URI へ GET 要求を送信するたびに、HTTP ステータス コード 200 (OK) が返されます。ジョブが完了すると、ステータス URI への直後の GET 要求によって HTTP ステータス コード 303 (See Other) が返され、Location ヘッダーによって出力 URI にリダイレクトされます。ジョブの結果 (出力またはエラー) を取得するには、出力 URI に従う必要があります。

認証を成功させるために、すべての呼び出しのヘッダーに有効なベアラー トークンを含めるようにしてください。

JavaScript の例

この例では、非同期ポーリング呼び出しモードを使用して、ブラウザーから API トリガーを介してジョブを開始する方法を示します。

const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));

const url = 'https://{yourDomain}/t/<INVOKE_URL>';
const token = '<PERSONAL_ACCESS_TOKEN>'; // could also be an access token retrieved via OAuth

const body = {
  'argument1': 123,
  'argument2': 'my string',
  '$callMode': 'AsyncRequestReply' // optional argument to force call mode to AsyncRequestReply
}

// if invocation is done by GET, place the parameters in query string and remove the 'Content-Type' header
const invokeRequestOptions = {
  method: 'POST',
  headers: new Headers({ 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }),
  body: JSON.stringify(body),
};

const redirectRequestOptions = {
  method: "GET",
  credentials: 'same-origin',
  headers: new Headers({ Authorization: `Bearer ${token}` }),
  redirect: "follow", // this option must be set to follow, otherwise an 'opaqueredirect' response is returned
};

const response = await fetch(url, invokeRequestOptions);
let newLocation = response.headers.get("Location");

// first response should be 202 and have a location header
console.log(`Got ${response.status}, with location: ${newLocation}`);

for (let i = 0; i < 20; i++) {
  await sleep(SLEEP_DURATION);

  // follow the location header to the new endpoint
  const statusResponse = await fetch(newLocation, redirectRequestOptions);

  // if the response was redirected (and automatically followed), then the output endpoint has been reached
  // the output of the job can be found in the body of the response in JSON format
  if (statusResponse.status != 200 || statusResponse.redirected)
  {
    // read the job output
    const output = await statusResponse.json();
    console.log(`Got ${statusResponse.status}, with body: ${JSON.stringify(output)}`);

    break;
}const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));

const url = 'https://{yourDomain}/t/<INVOKE_URL>';
const token = '<PERSONAL_ACCESS_TOKEN>'; // could also be an access token retrieved via OAuth

const body = {
  'argument1': 123,
  'argument2': 'my string',
  '$callMode': 'AsyncRequestReply' // optional argument to force call mode to AsyncRequestReply
}

// if invocation is done by GET, place the parameters in query string and remove the 'Content-Type' header
const invokeRequestOptions = {
  method: 'POST',
  headers: new Headers({ 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }),
  body: JSON.stringify(body),
};

const redirectRequestOptions = {
  method: "GET",
  credentials: 'same-origin',
  headers: new Headers({ Authorization: `Bearer ${token}` }),
  redirect: "follow", // this option must be set to follow, otherwise an 'opaqueredirect' response is returned
};

const response = await fetch(url, invokeRequestOptions);
let newLocation = response.headers.get("Location");

// first response should be 202 and have a location header
console.log(`Got ${response.status}, with location: ${newLocation}`);

for (let i = 0; i < 20; i++) {
  await sleep(SLEEP_DURATION);

  // follow the location header to the new endpoint
  const statusResponse = await fetch(newLocation, redirectRequestOptions);

  // if the response was redirected (and automatically followed), then the output endpoint has been reached
  // the output of the job can be found in the body of the response in JSON format
  if (statusResponse.status != 200 || statusResponse.redirected)
  {
    // read the job output
    const output = await statusResponse.json();
    console.log(`Got ${statusResponse.status}, with body: ${JSON.stringify(output)}`);

    break;
}
C# の例

この例では、非同期ポーリング呼び出しモードを使用して、C# ベースのアプリケーションから API トリガーを介してジョブを開始する方法を示します。

public async Task<string> AsyncPollingExample()
{
    const string url = "https://{yourDomain}/t/<INVOKE_URL>";
    const string token = "<PERSONAL_ACCESS_TOKEN>"; // could also be an access token retrieved via OAuth

    // create an http client that does not follow redirects and adds a bearer token on each call
    var httpClient = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false });
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

    var arguments = new Dictionary<string, object>
    {
        { "argument1", 123 },
        { "argument2", "my string" },
        { "$callMode", "AsyncRequestReply" }, // optional argument to force call mode to AsyncRequestReply
    };

    var httpResponseStart = await httpClient.PostAsJsonAsync(url, arguments);
    var redirectUri = httpResponseStart.Headers.Location;

    if (httpResponseStart.StatusCode != HttpStatusCode.Accepted)
        throw new Exception("Could not invoke workflow");

    while (true)
    {
        var httpPollingResponse = await httpClient.GetAsync(redirectUri);

        if (httpPollingResponse.StatusCode == HttpStatusCode.Redirect)
        {
            var outputLocation = httpPollingResponse.Headers.Location;
            var outputResponse = await httpClient.GetAsync(outputLocation);
            var jobOutput = await outputResponse.Content.ReadAsStringAsync();

            return jobOutput;
        }

        await Task.Delay(1000);
    }
}public async Task<string> AsyncPollingExample()
{
    const string url = "https://{yourDomain}/t/<INVOKE_URL>";
    const string token = "<PERSONAL_ACCESS_TOKEN>"; // could also be an access token retrieved via OAuth

    // create an http client that does not follow redirects and adds a bearer token on each call
    var httpClient = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false });
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

    var arguments = new Dictionary<string, object>
    {
        { "argument1", 123 },
        { "argument2", "my string" },
        { "$callMode", "AsyncRequestReply" }, // optional argument to force call mode to AsyncRequestReply
    };

    var httpResponseStart = await httpClient.PostAsJsonAsync(url, arguments);
    var redirectUri = httpResponseStart.Headers.Location;

    if (httpResponseStart.StatusCode != HttpStatusCode.Accepted)
        throw new Exception("Could not invoke workflow");

    while (true)
    {
        var httpPollingResponse = await httpClient.GetAsync(redirectUri);

        if (httpPollingResponse.StatusCode == HttpStatusCode.Redirect)
        {
            var outputLocation = httpPollingResponse.Headers.Location;
            var outputResponse = await httpClient.GetAsync(outputLocation);
            var jobOutput = await outputResponse.Content.ReadAsStringAsync();

            return jobOutput;
        }

        await Task.Delay(1000);
    }
}
非同期で完了を待たずに実行 (fire & forget)

fire & forget の呼び出しモードは、ジョブが正常に作成されると 200 OK ステータスを返します。ジョブに関するその他の情報は取得されません。

非同期で完了を待たずに実行 (fire & forget) のワークフロー。ジョブが中間呼び出しなしで完了する

docs image
JavaScript の例

この例では、非同期で完了を待たずに実行 (fire & forget) のモードを使用して、ブラウザーから API トリガーを介してジョブを開始する方法を示します。

const url = 'https://{yourDomain}/t/<INVOKE_URL>';
const token = '<PERSONAL_ACCESS_TOKEN>'; // could also be an access token retrieved via OAuth
  
const body = {
  'argument1': 123,
  'argument2': 'my string',
  '$callMode': 'FireAndForget' // optional argument to force call mode to FireAndForget
}

const options = {
  method: 'POST',
  headers: new Headers({ 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }),
  body: JSON.stringify(body),
};

let response = await fetch(url, options);

console.log(`Got ${response.status}`);const url = 'https://{yourDomain}/t/<INVOKE_URL>';
const token = '<PERSONAL_ACCESS_TOKEN>'; // could also be an access token retrieved via OAuth
  
const body = {
  'argument1': 123,
  'argument2': 'my string',
  '$callMode': 'FireAndForget' // optional argument to force call mode to FireAndForget
}

const options = {
  method: 'POST',
  headers: new Headers({ 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }),
  body: JSON.stringify(body),
};

let response = await fetch(url, options);

console.log(`Got ${response.status}`);
C# の例

この例では、非同期で完了を待たずに実行 (fire & forget) のモードを使用して、C# ベースのアプリケーションから API トリガーを介してジョブを開始する方法を示します。

public async Task FireAndForgetExample()
{
    const string url = "https://{yourDomain}/t/<INVOKE_URL>";
    const string token = "<PERSONAL_ACCESS_TOKEN>"; // could also be an access token retrieved via OAuth

    // create an http client that does not follow redirects and adds Bearer <token> on each call
    // if the follow redirects option is enabled, C# will not add a bearer token by default after the redirect
    var httpClient = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false });
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

    var arguments = new Dictionary<string, object>
    {
        { "argument1", 123 },
        { "argument2", "my string" },
        { "$callMode", "FireAndForget" }, // optional argument to force call mode to LongPolling
    };

    var response = await httpClient.PostAsJsonAsync(url, arguments);

    Console.WriteLine(response.StatusCode);
}public async Task FireAndForgetExample()
{
    const string url = "https://{yourDomain}/t/<INVOKE_URL>";
    const string token = "<PERSONAL_ACCESS_TOKEN>"; // could also be an access token retrieved via OAuth

    // create an http client that does not follow redirects and adds Bearer <token> on each call
    // if the follow redirects option is enabled, C# will not add a bearer token by default after the redirect
    var httpClient = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false });
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

    var arguments = new Dictionary<string, object>
    {
        { "argument1", 123 },
        { "argument2", "my string" },
        { "$callMode", "FireAndForget" }, // optional argument to force call mode to LongPolling
    };

    var response = await httpClient.PostAsJsonAsync(url, arguments);

    Console.WriteLine(response.StatusCode);
}
同期 (ロングポーリング)

この呼び出しモードでは、最初の呼び出しでブロックが行われ、ジョブが完了するまでしばらく待機し、その後にブロック呼び出しとリダイレクトが数回行われる可能性があります。最終的には、ジョブが完了すると、ジョブの結果 (出力またはエラー) が取得されます。

テナントの設定によっては、すべての呼び出しに認証が必要になる場合もあれば、最初の呼び出しのみに認証が必要な場合もあります。

同期 (ロングポーリング) ワークフロー。結果は成功/失敗を問わず最初の呼び出しで返される

docs image

同期 (ロングポーリング) ワークフロー。ジョブの完了に向けて複数の呼び出しが自動的に行われる

docs image

最初の呼び出しは、設定済みの HTTP 動詞 (GET、POST、PUT、DELETE) を使用して行われ、関連するジョブが Orchestrator 内に作成されます。ジョブが正常に作成されると、システムは現在の呼び出しをブロックし、その間にジョブの完了を待機します。ジョブが完了すると、ブロックされていた呼び出しが解放され、ジョブの出力引数を含む応答が送り返されます。

タイムアウト期間が経過してもジョブが完了していない場合、システムは HTTP ステータス コード 303 (See Other) で応答し、Location ヘッダーによってステータス URI にリダイレクトします。ユーザーはステータス URI に従うことが期待されます。これはジョブが完了するまでブロックされます。タイムアウト後にジョブが完了しない場合は、ステータス URI に再度リダイレクトされるため、リダイレクト ループが作成されます。ジョブが正常に完了すると、ジョブの結果 (出力またはエラー) が HTTP 応答の一部として取得されます。

既定では、認可用の有効なベアラー トークンがすべての呼び出しに含まれている必要があります。ただし、テナント設定オプションの [同期 API トリガーのリダイレクトに Authentication ヘッダーを要求] が選択されていない場合は、トリガーに対する最初の呼び出しでのみ Authentication ヘッダーが求められます。ステータス エンドポイントへの後続の呼び出しは、認可ヘッダーを設定せずに行うことができます。

この呼び出しモードで許可されているジョブの最長実行時間は 15 分間です。

JavaScript の例

この例では、同期 (ロングポーリング) 呼び出しモードを使用して、ブラウザーから API トリガーを介してジョブを開始する方法を示します。

const url = 'https://{yourDomain}/t/<INVOKE_URL>';
const token = '<PERSONAL_ACCESS_TOKEN>'; // could also be an access token retrieved via OAuth

const body = {
  'argument1': 123,
  'argument2': 'my string',
  '$callMode': 'LongPolling' // optional argument to force call mode to LongPolling
}

const options = {
  method: 'POST',
  headers: new Headers({ 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }),
  body: JSON.stringify(body),
  redirect: "follow", // follow redirects automatically
};

let response = await fetch(url, options);
const output = await response.json();

console.log(`Got ${response.status} with body ${JSON.stringify(output)}`);const url = 'https://{yourDomain}/t/<INVOKE_URL>';
const token = '<PERSONAL_ACCESS_TOKEN>'; // could also be an access token retrieved via OAuth

const body = {
  'argument1': 123,
  'argument2': 'my string',
  '$callMode': 'LongPolling' // optional argument to force call mode to LongPolling
}

const options = {
  method: 'POST',
  headers: new Headers({ 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }),
  body: JSON.stringify(body),
  redirect: "follow", // follow redirects automatically
};

let response = await fetch(url, options);
const output = await response.json();

console.log(`Got ${response.status} with body ${JSON.stringify(output)}`);
C# の例

この例では、同期 (ロングポーリング) 呼び出しモードを使用して、C# ベースのアプリケーションから API トリガーを介してジョブを開始する方法を示します。

public async Task SyncExample()
{
    const string url = "https://{yourDomain}/t/<INVOKE_URL>";
    const string token = "<PERSONAL_ACCESS_TOKEN>"; // could also be an access token retrieved via OAuth

    // create an http client that does not follow redirects and adds Bearer <token> on each call
    // if the follow redirects option is enabled, C# will not add a bearer token by default after the redirect
    var httpClient = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false });
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

    var arguments = new Dictionary<string, object>
    {
        { "argument1", 123 },
        { "argument2", "my string" },
        { "$callMode", "LongPolling" }, // optional argument to force call mode to LongPolling
    };

    var response = await httpClient.PostAsJsonAsync(url, arguments);

    while(response.StatusCode == HttpStatusCode.Redirect)
    {
        // in case of redirection, keep following the latest location in the header
        var location = response.Headers.Location;
        response = await httpClient.GetAsync(location);
    }

    // read the job output/error from the last request
    var jobOutput = response.Content.ReadAsStringAsync();

    Console.WriteLine(jobOutput);
}public async Task SyncExample()
{
    const string url = "https://{yourDomain}/t/<INVOKE_URL>";
    const string token = "<PERSONAL_ACCESS_TOKEN>"; // could also be an access token retrieved via OAuth

    // create an http client that does not follow redirects and adds Bearer <token> on each call
    // if the follow redirects option is enabled, C# will not add a bearer token by default after the redirect
    var httpClient = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false });
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

    var arguments = new Dictionary<string, object>
    {
        { "argument1", 123 },
        { "argument2", "my string" },
        { "$callMode", "LongPolling" }, // optional argument to force call mode to LongPolling
    };

    var response = await httpClient.PostAsJsonAsync(url, arguments);

    while(response.StatusCode == HttpStatusCode.Redirect)
    {
        // in case of redirection, keep following the latest location in the header
        var location = response.Headers.Location;
        response = await httpClient.GetAsync(location);
    }

    // read the job output/error from the last request
    var jobOutput = response.Content.ReadAsStringAsync();

    Console.WriteLine(jobOutput);
}

レートの制限

ステータス エンドポイントに対して実行できる要求の数は、開始されたジョブ 1 つあたり、10 秒につき 10 回までに制限されています。

保留中のジョブの制限

API トリガーによって開始される保留中のジョブの最大数は 100 です。この値は、テナント レベルの設定 [トリガー - API トリガー - 保留中ジョブの最大数] を使用して変更できます。既定値は 10 です。

ジョブを停止する

該当する [その他のアクション] ボタンをクリックし、次に [停止] をクリックします。オートメーション プロジェクトは、[停止すべきか確認] アクティビティを検出するまで実行されます。この間、ジョブは [停止中] ステートになります。このアクティビティが検出されると、実行は停止され、ジョブの最終的なステートは [成功] になります。[停止すべきか確認] アクティビティが検出されなかった場合、ジョブの実行はプロジェクトの最後まで停止されません。この場合も、最終的なステートは [成功] になります。

注:
  • Orchestrator から開始したジョブは、Orchestrator からのみ停止できます。
  • Assistant から開始したジョブは、Orchestrator の [ジョブ] ページから、および UiPath Assistant を使用して停止できます。
  • ジョブが停止すると、ジョブの終了スケジュールは失われます。そのため、ジョブの再実行時に [ジョブの実行を終了するスケジュールを設定] オプションを再設定する必要があります。

ジョブを再開する

該当する [その他のアクション] ボタンをクリックし、次に [再開] をクリックします。

ジョブを強制終了する

該当する [その他のアクション] ボタンをクリックし、次に [強制終了] をクリックします。オートメーション プロジェクトが強制終了され、[停止] とマークされ、[ジョブの詳細] ウィンドウに「ジョブはキャンセルされました」と表示されます。

注:
  • Orchestrator から開始したジョブは、Orchestrator の [ジョブ] ページから、および UiPath Assistant を使用して強制終了できます。
  • Assistant から開始したジョブは、Orchestrator の [ジョブ] ページから、および UiPath Assistant を使用して強制終了できます。
  • ジョブが強制終了すると、ジョブの終了スケジュールは失われます。そのため、ジョブの再実行時に [ジョブの実行を終了するスケジュールを設定] オプションを再設定する必要があります。

ジョブを再実行する

この機能を使用すると、ジョブ フローの構成を経る必要なく、ジョブのリストからすぐにジョブを実行できます。[停止][エラー]、または [成功] のどの最終ステートにあるジョブでも再実行できます。

注:
  • Assistant などのエージェントまたは Studio のリモート デバッグ セッションによってトリガーされたジョブは再実行できません。
  • [ジョブの実行を終了するスケジュールを設定] オプションがアクティブになっているジョブを再実行する場合、これらのオプションを再設定する必要があります。

この手順を開始するには、以前に何らかのジョブを開始して、そのジョブが最終状態に達している必要があります。

  1. 該当の [その他のアクション] ボタンをクリックして、[再実行] をクリックします。[ジョブを開始] ウィンドウが開き、ジョブの初期設定が表示されます。
  2. 必要な変更を行います。
  3. [開始] をクリックします。[ジョブを開始] ウィンドウが閉じて、実行が開始されます。各ジョブのステータスは、[ジョブ] ページにリアルタイムで表示されます。

ジョブのログを表示する

特定のジョブのログを表示するには、該当する [その他のアクション] ボタンをクリックし、[ログを表示] をクリックします。[ログ] ページが表示されます。ここには、対象のジョブの項目のみが含まれています。

注: リモート デバッグ セッションから開始したジョブで生成されるログは、[ジョブのログ] ページには表示されません。グローバルな [ログ] ページに表示されます。

ジョブの詳細を表示する

特定のジョブの詳細を表示するには、対応する [詳細を表示] ボタンをクリックします。[ジョブの詳細] ウィンドウが表示され、以下のようなさまざまな情報を確認できます。

  • 基になるプロセスの名前
  • 実行するロボットとマシン
  • ジョブが失敗した理由
  • ジョブが開始されない理由
  • 問題を修正し、ジョブの開始をトリガーするためのアクション

完了したジョブの詳細



保留中のジョブの詳細

docs image
注: [情報] フィールドには、失敗したジョブのライセンスに関する考慮事項は表示されません。ライセンスについて詳しくは、監視機能を使用してください。

実行メディアをダウンロードする

失敗したジョブの記録をダウンロードするには、[その他のオプション] > [記録をダウンロード] をクリックします。実行メディアは、設定に従ってダウンロードされます。

Support and Services icon
サポートを受ける
UiPath Academy icon
RPA について学ぶ - オートメーション コース
UiPath Forum icon
UiPath コミュニティ フォーラム
UiPath ロゴ (白)
信頼とセキュリティ
© 2005-2024 UiPath. All rights reserved.