.NET CoreアプリケーションへのHangfire導入と設定手順

Hangfireを.NET Coreプロジェクト(MVCやWeb APIなど)に統合するには、まずNuGetパッケージマネージャーを使用してHangfireをインストールします。プロジェクトの要件に合わせて適切なバージョンを選択してください。

SQL Serverを使用した設定

データベースバックエンドとしてSQL Serverを利用する場合、Startup.csConfigureServicesメソッドで以下のようにサービスを構成します。

public void ConfigureServices(IServiceCollection services)
{
    // 構成ファイルから接続文字列を取得
    var dbConnection = Configuration.GetSection("ConnectionStrings")["DefaultHangfireConnection"];

    // Hangfireの追加とSQL Serverストレージの設定
    services.AddHangfire(globalConfiguration => 
    {
        globalConfiguration.UseSqlServerStorage(dbConnection);
    });
    
    // その他のDIコンテナ設定...
}

MySQLを使用した設定

MySQLをデータストアとして使用するには、追加でHangfire.MySqlパッケージへの参照が必要です。構成オプションを詳細に指定する実装例は以下の通りです。

var mySqlConn = Configuration["DatabaseSettings:HangfireMySql"];
services.AddHangfire(config => config.UseStorage(
    new MySqlStorage(
        mySqlConn, 
        new MySqlStorageOptions
        {
            // トランザクション分離レベル
            TransactionIsolationLevel = IsolationLevel.ReadCommitted,
            // キューのポーリング間隔
            QueuePollInterval = TimeSpan.FromSeconds(15),
            // スキーマの自動作成
            PrepareSchemaIfNecessary = true,
            // ダッシュボードのジョブ表示上限
            DashboardJobListLimit = 50000,
            // テーブルプレフィックス(必要に応じて)
            TablesPrefix = ""
        }
    )));

ミドルウェアとダッシュボードの有効化

Configureメソッドにて、Hangfireサーバーの起動とダッシュボードUIのエンドポイント有効化を行います。これにより、ブラウザ上でジョブの状態を監視・管理できるようになります。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // Hangfireサーバーの起動
    app.UseHangfireServer();

    // ダッシュボードUIの有効化
    app.UseHangfireDashboard("/hangfire");

    // その他のミドルウェア(app.UseRoutingなど)...
}

設定後、https://localhost:5001/hangfire(または設定したポート)にアクセスすると、ジョブの実行状況や履歴を確認できる管理画面が表示されます。デフォルトではローカルアクセスのみ許可されていますが、本番環境では認証フィルタやIP制限を適切に設定してください。

定期ジョブ(Recurring Job)の登録

アプリケーション起動時に定期的に実行するタスクを登録するには、RecurringJob.AddOrUpdateメソッドを使用します。以下は、特定のメソッドを一定間隔で呼び出す例です。

// アプリ起動時の初期化処理などで実行
// "ProductSync"という識別子で、SyncProductDataメソッドを5分ごとに実行
RecurringJob.AddOrUpdate("ProductSync", () => SyncProductData(), Cron.MinuteInterval(5));

なお、PrepareSchemaIfNecessary = trueを設定している場合、初回実行時にデータベースへ必要なテーブルが自動作成されます。

Redisを使用した設定

スケーラビリティやパフォーマンスの観点からRedisを採用する場合、StackExchange.Redisを使用して接続を構成します。以下はStartup.csでの設定例です。

// 接続文字列の取得
var redisConfig = Configuration.GetSection("Redis");
var redisConnStr = redisConfig["ConnectionString"];
var keyPrefix = redisConfig["Prefix"];

// Redis接続の確立
var multiplexer = ConnectionMultiplexer.Connect(redisConnStr);

// ストレージオプションの定義
var storageOptions = new RedisStorageOptions
{
    Prefix = keyPrefix,
    Db = 0 
};

// 設定ファイルからDB番号を読み込んで上書き
if (int.TryParse(redisConfig["DatabaseId"], out int dbId))
{
    if (dbId >= 0 && dbId <= 15)
    {
        storageOptions.Db = dbId;
    }
}

// HangfireにRedisストレージを登録
services.AddHangfire(config => config.UseRedisStorage(multiplexer, storageOptions));

設定ファイル (appsettings.json)

上記のコードで参照されている設定値は、appsettings.jsonに以下のように定義します。

{
  "ConnectionStrings": {
    "DefaultHangfireConnection": "Server=.\\SQLEXPRESS;Database=HangfireDb;Trusted_Connection=True;"
  },
  "Redis": {
    "ConnectionString": "127.0.0.1:6379,password=,ssl=false",
    "Prefix": "myapp:hangfire:",
    "DatabaseId": "1"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  }
}

5月27日 23:01 投稿