簡體   English   中英

Hangfire 激活器未處理

[英]Hangfire activator not disposing

我遇到了 Hangfire 的問題,它沒有在 NET 5 的 WebApi 中處理它實例化的對象。

這是我在“ConfigureServices()”中的配置(相當標准,順便說一句):

services.AddScoped<ITestService, TestService>(); // I have also tried with "AddTransient()"

services.AddHangfire(x => x.UseSqlServerStorage(Configuration.GetConnectionString("Default")));
services.AddHangfireServer();

然后,我有以下行來在“Configure()”中配置重復作業:

public void Configure(IApplicationBuilder app,
                      IWebHostEnvironment env,
                      IHttpContextAccessor httpContextAccessor,
                      ITestService testService)
{
    // Omitting other configure code here

    RecurringJob.AddOrUpdate("Check", () => testService.Test(), Cron.Minutely); // You can try "*/1 * * * ? *" to speed it up
}

如您所見,“ITestService”正在通過 IoC 注入。

僅供參考,“ITestService”是“IDisposable”。 如果我在構造函數和“Dispose()”方法中都設置斷點,則構造函數會在每個間隔被調用,而“Dispose()”則永遠不會被調用。

這對我來說是個問題,因為服務本身還有其他依賴項,例如存儲庫(即:SQL 連接)。 每當時間過去,應用程序就會開始中斷,因為它失去了池中的連接:

失敗:Hangfire.Processing.BackgroundExecution[0] Execution Worker 由於異常,現在處於 Failed state 中,將在 00:05:00 內重試執行 System.InvalidOperationException: Timeout expired。 在從池中獲取連接之前超時時間已過。 這可能是因為所有池連接都在使用中並且達到了最大池大小。

如果我沒記錯的話,此錯誤與未處理 SQL 連接有關。

那么,你認為我做錯了什么嗎? 或者它可能是一個錯誤?

編輯:

如果我將“this.Dispose()”放在 TestService.Test() 的末尾,並在那里手動處理存儲庫,那么之前的錯誤就修復了。 但我認為這不是一個合適的解決方案:S。

如評論中所述,您應該使用:

RecurringJob.AddOrUpdate<ITestService>("Check", t => t.Test(), Cron.Minutely);

以這種方式調用該方法將觸發ITestServer的依賴注入,並且實例將遵循預期的生命周期,並需要調用Dispose()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM