GS2-JobQueue SDK for Game Engine API リファレンス

ゲームエンジン向け GS2-JobQueue SDK の モデルの仕様 と API のリファレンス

モデル

EzJob

ジョブ

ジョブキューとは直ちに処理を完了せず、処理を遅延実行するための仕組みです。
例えば、キャラクターを入手したときに直ちに実行しなければならない処理としては所持品にキャラクターを格納することです。
一方で、直ちに処理しなければならないわけではない処理として、図鑑に登録する という処理があります。

こういった直ちに処理するまでもない処理をジョブキューを経由して処理するようにすることで、障害に強い設計にすることができます。
なぜなら、図鑑サービスが何らかの障害によって止まっていたとしても、図鑑に登録されない状態でゲームを継続することができます。
ジョブキューに詰まれた処理は失敗しても、障害が解消した後でリトライすることで結果的に正しい状態にできます。

GS2 ではこのような 結果整合 処理を推奨しており、様々な場面でジョブキューを利用した遅延処理が行われます。

有効化条件必須デフォルト値の制限説明
jobIdstring
~ 1024文字ジョブ GRN
※ サーバーが自動で設定
scriptIdstring
~ 1024文字スクリプト GRN
argsstring
~ 5242880文字引数
ジョブの実行時にスクリプトに渡すJSON形式のリクエストパラメータです。アクションタイプや対象リソースなどの具体的な操作内容を含みます。最大5MBです。
currentRetryCountint00 ~ 100現在のリトライ回数
失敗後にこのジョブがリトライされた回数です。リトライ可能なエラーで実行が終了するたびにインクリメントされます。このカウントがmaxTryCountに達すると、ジョブは恒久的な失敗としてマークされます。
maxTryCountint31 ~ 100最大試行回数
初回の試行とリトライを含めて、このジョブを実行できる最大回数です。すべての試行が失敗した場合、ジョブは放棄されます。デフォルトは3、最大100です。

EzJobResult

ジョブ実行結果

単一のジョブ実行試行の結果を記録します。各試行ごとに個別のJobResultが作成されるため、複数回リトライされたジョブには複数の結果が存在します。statusCodeはジョブが成功したか失敗したかを示します。

有効化条件必須デフォルト値の制限説明
statusCodeint
0 ~ 1000ステータスコード
スクリプト実行から返されたHTTPステータスコードです。2xxコードは成功を示し、その他のコードは失敗を示します。リトライ可能なエラーの場合、maxTryCountに達していなければ自動リトライが行われることがあります。
resultstring
~ 5242880文字レスポンスの内容
スクリプト実行から返されたJSON形式のレスポンスボディです。成功時には結果データを、失敗時にはエラーの詳細を含みます。最大5MBです。

EzJobEntry

登録ジョブ

ジョブキューに新しいジョブを登録するためのパラメータを表します。実行するスクリプト、JSON引数、最大リトライ回数を含みます。ジョブをキューにプッシュする際の入力として使用されます。

有効化条件必須デフォルト値の制限説明
scriptIdstring
~ 1024文字スクリプト GRN
argsstring“{}”~ 131072文字引数
ジョブの実行時にスクリプトに渡すJSON形式のリクエストパラメータです。デフォルトは空のJSONオブジェクト “{}” です。最大128KBです。
maxTryCountint30 ~ 100最大試行回数
初回の試行とリトライを含めて、ジョブを実行できる最大回数です。デフォルトは3、最大100です。

EzJobResultBody

ジョブの実行結果

試行番号、ステータスコード、レスポンス内容、実行タイムスタンプを含むジョブ実行結果の軽量な表現です。

有効化条件必須デフォルト値の制限説明
tryNumberint
1 ~ 10000試行回数
この実行結果の連番試行番号で、1から始まります。どのリトライ試行がこの結果を生成したかを識別するために使用されます。
statusCodeint
0 ~ 1000ステータスコード
スクリプト実行から返されたHTTPステータスコードです。2xxコードは成功を示し、その他のコードは失敗を示します。リトライ可能なエラーの場合、maxTryCountに達していなければ自動リトライが行われることがあります。
resultstring
~ 5242880文字レスポンスの内容
スクリプト実行から返されたJSON形式のレスポンスボディです。成功時には結果データを、失敗時にはエラーの詳細を含みます。最大5MBです。
tryAtlong
現在時刻作成日時
UNIX 時間・ミリ秒
※ サーバーが自動で設定

メソッド

run

プレイヤーのジョブキューにある次のジョブを実行する

GS2 では、すぐに完了しなくてもよい処理を「ジョブキュー」で遅延実行します。たとえば、キャラクターを入手したとき、所持品への追加は即座に行いますが、図鑑への登録はジョブキューを通じて後から処理できます。
この仕組みにより、関連サービスが一時的に停止していてもゲームを継続でき、キューに溜まったジョブはサービス復旧後にリトライされて正しい状態になります。

このAPIを呼び出すと、プレイヤーのキューにある次のジョブを1つ実行し、その結果を返します。
レスポンスに含まれる isLastJob フラグが false の場合はまだ未処理のジョブが残っているため、true になるまで繰り返し呼び出してください。

ネームスペースにプッシュ通知を設定しておけば、新しいジョブが追加されたタイミングで通知を受け取れるため、ポーリングせずに通知をトリガーにしてこのAPIを呼び出すこともできます。

ネームスペースで enableAutoRun を有効にしている場合は、ジョブはサーバー側で自動実行されるため、このAPIを呼び出す必要はありません。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession

Result

説明
itemEzJobジョブ
resultEzJobResultBodyジョブの実行結果
isLastJobbool

Error

このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。

基底クラス説明
ConflictExceptionConflictExceptionジョブキューの実行が衝突しました。リトライが必要です

実装例

// New Experience ではSDKレベルで実行されるため明示的にAPIを呼び出す必要はありません
// New Experience runs at the SDK level, so there is no need to explicitly call the API
// New Experience ではSDKレベルで実行されるため明示的にAPIを呼び出す必要はありません
// New Experience runs at the SDK level, so there is no need to explicitly call the API
// SDKレベルで実行されるため明示的にAPIを呼び出す必要はありません

getResult

完了したジョブの実行結果を取得する

ジョブ名を指定して、そのジョブの実行結果を取得します。
結果には、成功・失敗を示すステータスコードと、ジョブが返したレスポンスの内容が含まれます。

図鑑への登録や報酬の配布など、遅延処理が正しく完了したかどうかを確認したい場合に使います。
ジョブが複数回リトライされた場合は、試行回数を指定して特定の試行の結果を確認することもできます。

※ ジョブの実行結果は実行後一定期間のみ保持され、自動的に削除される場合があります。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
jobNamestring
UUID~ 36文字ジョブの名前
ジョブの一意な名前を保持します。
名前は UUID(Universally Unique Identifier)フォーマットで自動的に生成され、各ジョブを識別するために使用されます。

Result

説明
itemEzJobResultジョブの実行結果

実装例

    var domain = gs2.JobQueue.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Job(
        jobName: "job-0001"
    ).JobResult(
        tryNumber: null
    );
    var item = await domain.ModelAsync();
    var domain = gs2.JobQueue.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Job(
        jobName: "job-0001"
    ).JobResult(
        tryNumber: null
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;
    const auto Domain = Gs2->JobQueue->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Job(
        "job-0001" // jobName
    )->JobResult(
        nullptr // tryNumber
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
値の変更イベントハンドリング
    var domain = gs2.JobQueue.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Job(
        jobName: "job-0001"
    ).JobResult(
        tryNumber: null
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    var domain = gs2.JobQueue.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Job(
        jobName: "job-0001"
    ).JobResult(
        tryNumber: null
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    const auto Domain = Gs2->JobQueue->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Job(
        "job-0001" // jobName
    )->JobResult(
        nullptr // tryNumber
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::JobQueue::Model::FJobResult> value) {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    Domain->Unsubscribe(CallbackId);

イベントハンドラ

OnPushNotification

ジョブキューにジョブが登録されたときに使用するプッシュ通知

名前説明
namespaceNamestringネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
userIdstringユーザーID

実装例

    gs2.JobQueue.OnPushNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var userId = notification.UserId;
    };
    gs2.JobQueue.OnPushNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var userId = notification.UserId;
    };
    Gs2->JobQueue->OnPushNotification().AddLambda([](const auto Notification)
    {
        const auto NamespaceName = Notification->NamespaceNameValue;
        const auto UserId = Notification->UserIdValue;
    });

OnRunNotification

ジョブキューのジョブを実行した時に使用するプッシュ通知

名前説明
namespaceNamestringネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
userIdstringユーザーID
jobNamestringジョブの名前
ジョブの一意な名前を保持します。
名前は UUID(Universally Unique Identifier)フォーマットで自動的に生成され、各ジョブを識別するために使用されます。

実装例

    gs2.JobQueue.OnRunNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var userId = notification.UserId;
        var jobName = notification.JobName;
    };
    gs2.JobQueue.OnRunNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var userId = notification.UserId;
        var jobName = notification.JobName;
    };
    Gs2->JobQueue->OnRunNotification().AddLambda([](const auto Notification)
    {
        const auto NamespaceName = Notification->NamespaceNameValue;
        const auto UserId = Notification->UserIdValue;
        const auto JobName = Notification->JobNameValue;
    });