SysOperationSandbox フレームワークの実装
財務と運用アプリには、時間のかかる操作を実行する複数の方法が用意されています。
- バッチ プロセスを使用すると、バッチ サーバーに実装された時間のかかるタスクを実行できます。
- 場合によっては、Web クライアントでプロセスを実行する必要があります。 プロセスを同期モードで実行した場合、プロセスが完了するまで Web ブラウザーがフリーズします。 プロセスの時間が長すぎる場合は、Application Object Server (AOS) によってクライアントが切断され、最終的に Web クライアントで実行されていたプロセスが失敗します。 このような状況を回避するため、非同期プロセスを実行できます。これにより、ユーザーのために Web クライアントが解放されます。
- SysOperationSandbox フレームワークを使用すると、実行時間の長いプロセスを非同期モードで別のセッションに実装できます。 さらに、ユーザー インターフェイスがフリーズすることなく、非同期プロセスの待機ページも表示されます。 プロセスをキャンセルするキャンセル ボタンも表示されます。
SysOperationSandbox
SysOperationSandbox を使用すると、Web クライアントで発生している非同期セッションで同期操作を実行できます。 フレームワークを使用すると、2 つのクライアント セッションを並列で実行できます。 最初のセッションは、静的クラス内でビジネス ロジックを実行する非同期セッションです。 2 つ目のセッションは、ユーザー インターフェイスと通信し、タイムアウトを許可せずに通信を維持します。 その結果、Web クライアント切断のリスクなしで、同期セッションをフォームで実行できるようになります。
サンドボックス フレームワークは、クラスの新しいインスタンスを作成し、そのインスタンスを非同期モードで実行します。 クラスの実装が完了すると、同期プロセスが続行されます。 フレームワークは、run() メソッドを開始する前にpack()/unpack() メソッドを使用することにより、現在のインスタンスの状態を新しいインスタンスにマーシャリングできます。 新しいインスタンスが現在のインスタンスに戻った場合、同じプロセスが続行されます。 したがって、クラスの状態は、RunBaseBatch から派生したクラスで既に使用できる pack() メソッドと unpack() メソッドで適切にシリアル化する必要があります。
例
BankCheque と呼ばれるカスタム テーブルには、2 つのフィールド BankAccount および CheckNo があります。 サンドボックス フレームワークを使用することにより、ユーザー インターフェイス駆動型のプロセスを実行して、10000 から始まる 100 件の新しい小切手番号を追加する必要があります。
- ビジネス ロジックを使用して新しいクラスを作成し、100 件の新しい小切手番号を作成します。 pack メソッドと unpack メソッドは、クラスでも作成されます。
class SandBoxLabHelper
{
public static container AsyncInfo(container _parameters)
{
str bankAccount = conPeek(_parameters, 1);
int checkStart = conPeek(_parameters, 2);
int checkCount = conPeek(_parameters, 3);
BankChequeTable bankChequeTable;
for(int i = checkStart; i < (checkStart + checkCount); i++)
{
bankChequeTable.clear();
bankChequeTable.AccountID = bankAccount;
bankChequeTable.ChequeNum = int2Str(i);
bankChequeTable.insert();
}
return [true];
}
public container pack()
{
return conNull();
}
public boolean unpack(container _packedClass)
{
return true;
}
}
- 新しいフォームを作成して、ボタンを追加します。 サンドボックス フレームワークを使用することにより、前の AsyncInfo 静的メソッドを実行するボタンのコードを clicked() メソッドで記述します。
public void clicked()
{
boolean result;
container mCon;
mCon = conIns(mCon, 1, "1111111111");
mCon = conIns(mCon, 2, 100000);
mCon = conIns(mCon, 3, 100);
[result] = SysOperationSandbox::callStaticMethod(classNum(SandBoxLabHelper), staticMethodStr(SandBoxLabHelper, AsyncInfo), mCon, "Processing", "Completed", "Cancelled");
super();
}