次の方法で共有


バッチ クラスの作成

コミュニティの関心グループが Yammer から Microsoft Viva Engage に移行されました。 Viva Engage コミュニティに参加し、最新のディスカッションに参加するには、「 Finance and Operations Viva Engage Community へのアクセスを要求する 」フォームに入力し、参加するコミュニティを選択します。

Microsoft Dynamics 365 の財務および運用アプリでは、バッチ処理はシステムのパフォーマンスに影響を与えることなくバックグラウンドでタスクを効率的に実行します。 この記事では、RunBaseBatch を基本クラスとしてバッチ クラスを作成する方法を説明します。

前提条件

バッチ クラスを作成するには、次の前提条件が必要です。

  • 財務と運用アプリ環境へのアクセス
  • X++プログラミング言語の基本的な理解
  • 財務と運用開発ツールをインストールした Visual Studio

RunBaseBatch を使用したバッチ クラスの作成

  1. Visual Studio では、財務と運用アプリの開発環境に接続します。

  2. ソリューション エクスプローラーで、プロジェクトを保留 (または右クリック)し、追加>新しい項目を選択します。

  3. FinNaceOperations>Dynamics 365 の項目>コード>クラスを選択します。

  4. クラスにはわかりやすい名前を入力します (MyBatchClass など)。

  5. 新しいクラス内部で、クラスを拡張して RunBaseBatch クラスを定義 します。 この RunBaseBatch クラスは、バッチ処理に必要な基本機能を提供します。

    class MyBatchClass extends RunBaseBatch
    {
        // Your code will go here
    }
    
  6. 必要に応じて、RunBaseBatch クラスが提供するメソッドを上書きします。 最もよく上書きされるメソッドは run()main() です。

    public void run()
    {
        // This method is the entry point for the batch class
        super();
    }
    
    public static void main(Args _args)
    {
        // This method is used to create an instance of the batch class, prompt the user for input using dialog,
        // and then execute the batch job using run().
    }
    
  7. この run() メソッド内では、バッチ ジョブを実行するロジックを実装します。 このロジックには、データ処理、計算、その他のタスクが含まれます。 main() メソッド内で、バッチ クラスをインスタンス化して、run() を呼び出します。

    public void run()
    {
        // Perform batch processing tasks here
        // For example:
        info("Batch job started!");
        // Your logic goes here
        info("Batch job completed!"); 
    }
    
    public static void main(Args _args)
    {
        MyBatchClass batch = new MyBatchClass();
        // Run the batch class
        batch.run();
    }
    
  8. dialog() メソッドをバッチ クラスに統合します。 この dialog() メソッドを使用すると、ユーザーがバッチ ジョブをスケジュールするときに入力を求めるメッセージを表示できます。

    class MyBatchClass extends RunBaseBatch
    {
        DialogField dialogMyParameter;
    
        str myParameter = "Default value";
    
        #define.CurrentVersion(1)
        #localmacro.CurrentList
            myParameter
        #endmacro
    
        public container pack()
        {
            // This method is used by batch platform to serialize batch parameters in a container
            return [#CurrentVersion, #CurrentList];
        }
    
        public boolean unpack(container _packedClass)
        {
            // This method is used by batch platform to deserialize batch parameters from stored 
            // batch parameter container
    
            Integer version = RunBase::getVersion(_packedClass);
            container packedData;
    
            switch (version)
            {
                case #CurrentVersion:
                    [version, #CurrentList] = _packedClass;
                    break;
                default:
                    return false;
            }
    
            return true;
        }
    
        public Object dialog()
        {
            // This method is invoked when user opens batch parameter dialog
            // It helps to add parameters to batch class and set their default value
    
            DialogRunbase dialog = super();
    
            dialogMyParameter = dialog.addField(enum2Str(Types::Integer), "My Parameter");
    
            // Set a default value of parameter
            dialogMyParameter.value(myParameter);
    
            return dialog;
        }
    
        public boolean getFromDialog()
        {
            // This method is invoked by batch platform to read the values of parameters from batch 
            // parameter dialog method
            myParameter = dialogMyParameter.value(); 
    
            return super();
        }
    
        public void run()
        {
            // This method is the entry point for the batch class
    
            info("Batch job started!");
            // Access the parameter value entered by the user
            info("My Parameter: " + this.myParameter);
            // Your main batch logic goes here
            info("Batch job completed!");
        }
    
        public static void main(Args _args)
        {
            // This method is used to create an instance of the batch class, prompt the user 
            // for input using dialog, and then execute the batch job using run().
    
            MyBatchClass batch = new MyBatchClass();
            if (batch.prompt())
            {
                batch.run();
            }
        }
    }
    
  9. バッチクラスの準備ができたら、財務と運用アプリケーション環境に展開します。 その後、アプリケーションのバッチ ジョブ スケジューラを使用して、バッチ ジョブが特定の間隔で実行されるようにスケジュールできます。

ベスト プラクティス

  • バッチ再試行ロジックを実装します。 バッチ クラスを再試行できるまでしてください。 つまり、エラーが発生した場合は自動的に再試行されます。 この方法は、一時的なエラーを処理し、処理の信頼性を高めます。
  • 有効なエラー処理を実装します。 バッチ クラスに信頼性の高いエラー処理メカニズムを実装し、例外やエラーを段階的に処理します。 トラブルシューティングや監視のために、エラーを適切にログ記録します。
  • トランザクションの期間を短くします。 バッチ クラス内の個々のトランザクションの期間をできるだけ短くして、データベースのロックと競合の問題を最小限に抑えます。 この方法により、同時実行およびシステム 全体のパフォーマンスが向上します。
  • タスクの数が多く追加されることを避けます。 単一のバッチ ジョブにタスクを追加する場合は注意が必要です。 1,000 以上のタスクが非効率につながる一方で、4,000 以上の作業は過剰と見なされます。 複雑なバッチ ジョブ処理を小さなジョブと管理しやすいタスクに分解して、保守性とパフォーマンスの両方を向上させます。
  • バッチ タスクの依存関係を制限します。 ジョブ内のバッチ タスク間には過剰な依存関係を避ける必要があります。 依存関係を最小限に抑えて、タスクを個別に実行できるようにします。 この方法は、並列性とスケーラビリティの向上に役立ちます。
  • バッチ パラメーターの使用を最適化します。 バッチ パラメーターを効率的に使用して、必要な情報をバッチ ジョブに渡します。 わかりやすくシンプルさを維持するため、パラメーターに過剰なデータを入れないようにしましょう。
  • 実行の期間を短くします。 一時的なインフラストラクチャの問題の影響を軽減するには、バッチ クラスの実行時間が短いままであることを確認します。 処理時間を短くすることで、脆弱性のウィンドウを最小限にし、システムの問題をよりよく管理することができます。
  • べき等性の設計。 バッチクラスの操作は、べき等であるように設計します。 つまり、同じ操作を複数回実行した場合、1 回の実行で同じ結果を得る必要があります。 このアプローチでは、失敗したバッチジョブの再試行が、重複処理や意図しない処理につながらないようにします。 したがって、データの整合性を維持する上で役立ちます。
  • トランザクションの整合性を実装します。 バッチ クラス操作がトランザクションの整合性を維持する必要があります。 そのため、エラーが発生した場合、トランザクションはロールバックして、部分的または一貫性のないデータ更新を防ぐことができます。 この方法は、データの整合性と信頼性を維持するのに役立ちます。
  • 再開するためにチェックポイントを使用します。 バッチクラスにチェックポイントを実装し、処理の進捗を追跡し、失敗した場合は正常に処理された最後のレコードから再開できるようにします。 この方法により、以前に完了したタスクの再処理を必要とせずに効率的に復旧できます。
  • 部分的な失敗をうまく処理します。 バッチ クラス操作の部分的な失敗を優雅に処理するエラー処理メカニズムを実装します。 エラーをログに記録し、必要に応じてトランザクションをロールバックし、トラブルシューティングと解決の目的で適切な通知を提供します。
  • バッチ同時実行制御を使用します。 並列処理を管理し、類似のデータ エンティティに過度の負荷がかからないようにするバッチ同時実行制御メカニズムを実装します。 並列処理の次数を制御することで、同じデータへの同時アクセスによって発生する競合やパフォーマンスの低下を防ぐことができます。 スループットを最適化し、システム 化を管理するには、ワークロード特性およびシステム リソースに基づいてバッチの同時実行設定を適切に構成します。
  • 生産内でのみエラーのバッチ履歴を有効にします。 運用環境でエラーが発生した場合にのみ詳細情報が記録され、バッチ履歴の設定を構成します。 この方法により、大規模なバッチ履歴が累積されるのを防ぐ際に役立ちます。特に、多数のタスクを含むバッチ ジョブや、頻繁に繰り返しスケジュールが設定されるバッチ ジョブでは、履歴が累積されるのを防ぐ際に役立ちます。 バッチ履歴をエラーに限定することで、バッチ ジョブのパフォーマンスを監視し、問題のトラブルシューティングを行うときに、ストレージの使用を効果的に管理し、明確さを維持できます。
  • テスト: べき等性と復旧 さまざまな障害シナリオで、バッチクラスの冪等性と復旧能力を徹底的にテストします。 実稼働環境で信頼性を確保するには、失敗したバッチ ジョブの再試行がデータの重複や不整合につながる可能性がない点を検証します。
  • バッチ ジョブのパフォーマンスを監視します。 バッチ ジョブのパフォーマンスを定期的に監視して、最適化のボトルネックや領域を特定します。 監視ツールおよびログを使用して、リソース稼働率と処理時間を追跡します。
  • バッチジョブを賢くスケジュール設定しましょう。 システムのパフォーマンスやユーザー エクスペリエンスの妨げにならないよう、バッチジョブをオフピーク時にスケジュールします。 バッチ処理をスケジュールする場合は、ワークロード パターンとリソースの可用性を考慮します。 定期的なワークロードの場合は、 アクティブなバッチ期間を検討してください
  • バッチジョブを徹底的にテストします。 バッチ ジョブを生産に配置する前に、開発環境またはテスト環境で包括的なテストを実行します。 さまざまなシナリオで機能、エラーの処理、パフォーマンスを検証します。

次のステップ

バッチ クラスを作成した後、エラー処理、ログなどの機能を追加して、バッチ クラスを強化して、より高い信頼性と効率性を導きます。 次の一覧などの高度な記事を参照できます: