Hangfire 및 ASP를 사용하면 백그라운드 작업을 쉽게 수행할 수 있습니다.순핵심

항파이어는 하나야.NET 라이브러리를 사용하면 백그라운드 작업을 쉽게 추가할 수 있습니다.NET 응용 프로그램.그것은 일회성'시작 및 잊기'작업을 지원하고 중복 작업을 배정합니다.이 외에도 지속성을 지원하기 때문에 프로그램을 다시 시작해도 모든 작업이 계속 존재합니다.

왜 배경 미션이 필요합니까?


시간이 오래 걸리는 조작을 수행해야 하는 상황에서 백그라운드 임무는 매우 중요하다.백그라운드 작업이 없으면 작업이 끝날 때까지 기다릴 때 사용자에 대한 응답이 늦어져 나쁜 사용자 체험을 초래할 수 있습니다.백그라운드 작업을 통해 프로세스는 백그라운드에서 계속 실행되고 사용자에게 즉시 응답을 보낼 수 있습니다.주의해야 할 것은 이것은 사용자가 프로세스 결과에 의존하지 않고 응답하는 프로세스에만 적용된다는 것이다.
백그라운드 작업의 좋은 예는 전자메일을 보내는 것이다.예를 들어 한 사용자가 사이트를 등록했다고 가정한다.그들은 상세한 정보를 기입하고 제출을 클릭한 후에 사이트에서 회답을 받아 등록에 성공했다고 표시했다.한동안 후, 그들은 등록을 확인하는 이메일을 받았다.이 경우 사용자가'제출'을 누르면 전자 우편을 보내는 백그라운드 작업이 시작되지만, 웹 사이트는 전자 우편 작업이 끝날 때까지 기다릴 필요가 없기 때문에 사용자가 등록에 성공했다고 즉시 응답할 수 있다.
반복적인 임무는 일련의 상황에서도 매우 유용하다.일반적인 용례는 정기적으로 보고서를 생성하거나 데이터의 완전성을 검사할 수 있다.

ASP에서 Hangfire를 사용합니다.순핵심


이 예에서는 ASP를 사용합니다.Hangfire를 실행하기 위한 NET Core 3.1 웹 응용 프로그램입니다.Hangfire는 확실히 다른 사람들과 합작하고 있습니다.NET 항목 유형이지만 조금 다른 패키지를 선택해야 할 수도 있습니다.

Hangfire 설치 및 구성


새 ASP 생성부터 시작합니다.NET 핵심 웹 응용 프로그램입니다.API 템플릿을 사용하도록 선택했지만 MVC 템플릿도 정상적으로 작동할 수 있습니다.
NuGet 패키지 관리자로 이동하여 Hangfire.Core, Hangfire.AspNetCoreHangfire.MemoryStorage 패키지를 설치합니다.우리가 이곳에서 메모리 저장소를 사용하는 것은 사용하기 편리하기 위해서이지만, 생산에서 사용하지 마십시오. 프로그램을 다시 시작하면 당신의 임무가 오래 지속되지 않기 때문입니다.이 강좌의 뒷부분에서 SQL 데이터베이스를 지속적인 방법으로 사용하는 방법을 보여 드리겠습니다.Startup.cs로 이동하여 다음 코드 행을 추가합니다.
// rest of startup class

public void ConfigureServices(IServiceCollection services)
{
  // rest of services

  services.AddHangfire(c => c.UserMemoryStorage());
  services.AddHangfireServer();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  // rest of middleware

  app.UseEndpoints(endpoints =>
  {
    endpoints.MapControllers();
    endpoints.MapHangfireDashboard();
  }
}
이것이 바로 당신이 필요로 하는 모든 설정입니다.응용 프로그램을 실행하고 브라우저에서 https://localhost:{yourPort}/hangfire 으로 이동합니다.지금 Hangfire 대시보드를 보셔야 합니다.

작업을 시작할 때 이 대시보드로 돌아가 상태를 모니터링할 수 있습니다.

간단한 Fire and forget 작업 만들기

IBackgroundJobClient 를 사용하고 싶은 클래스에 주입하고 Enqueue 방법을 실행하여 간단한 Fire and forget 작업을 시작할 수 있습니다.
public class MyClass
{
  private readonly IBackgroundJobClient _backgroundJobClient;

  public MyClass(IBackgroundJobClient backgroundJobClient)
  {
    _backgroundJobClient = backgroundJobClient;
  }

  public bool MyMethod()
  {
    _backgroundJobClient.Enqueue(() => Console.WriteLine("I'm a Fire and Forget job!"));

    return true;
  }
}
이 경우 MyMethod 방법은true로 즉시 되돌아옵니다.작업은 백그라운드 작업이기 때문에 일정 시간 후에 실행될 것입니다.

간단한 반복 작업 만들기


순환 작업은 IRecurringJobManager 을 사용하고 추가 파라미터를 설정해야 합니다.
public class MyClass
{
  private readonly IRecurringJobManager _recurringJobManager;

  public MyClass(IRecurringJobManager recurringJobManager)
  {
    _recurringJobManager = recurringJobManager;
  }

  public bool MyMethod()
  {
    _recurringJobManager.AddOrUpdate(
      "my-id",
      () => Console.Writeline("I'm a recurring job!"),
      "* * * * *");

    return true;
  }
}
첫 번째 매개변수는 작업의 ID입니다.이것은 나중에 작업을 업데이트하고 삭제하는 데 사용되기 때문에 유일해야 합니다._recurringJobManager.RemoveIfExists("my-id")를 사용하여 작업을 삭제할 수 있습니다.
두 번째 인자는 실행하고자 하는 작업입니다.
세 번째 파라미터를 acron string라고 하는데 이것은 컴퓨터가 스케줄링 작업에 사용되는 표준화 방법이다.이 예에서 * * * * * Hangfire에 분당 한 번씩 작업을 실행하라고 알려 줍니다.Cron 문자열은 곤혹스러울 수 있기 때문에 this website 문자열이 무엇인지 확인하는 데 도움을 줍니다.

더 복잡한 작업 실행


실제로 위에서 설명한 작업보다 더 복잡한 작업을 실행하기를 원할 것입니다.Hangfire는 이 서비스 실행 방법을 사용할 수 있도록 서비스를 작업에 주입할 수 있습니다.예를 들어 우리가 Emailer 서비스와 SendEmail 방법을 가지고 있다고 가정하자.이런 방법은 전자메일을 구축하기 위해 다른 각종 서비스에 의존할 수도 있다.
public class Emailer 
{
  private readonly IDependancyA _dependancyA;
  private readonly IDependancyB _dependancyB;

  public Emailer(IDependancyA dependancyA, IDependancyB dependancyB)
  {
    _dependancyA = dependancyA;
    _dependancyB = dependancyB;
  }

  public void SendEmail()
  {
    var dataA = _dependancyA.GetData();
    var dataB = _dependancyB.GetData();

    // do other things to send email
  }
}
그리고 우리는 IBackgroundJobClient 또는 IRecurringJobManager 을 사용하여 SendEmail 방법을 실행할 수 있다.모든 의존항은 자동으로 해결해야 한다.
_backgroundJobClient.Enqueue<Emailer>(e => e.SendEmail());
_recurringJobManager.AddOrUpdate<Emailer>("my-id", e => e.SendEmail(), "* * * * *");

SQL 데이터베이스를 사용하여 지속성 추가


실제 응용 프로그램에서 데이터베이스 지속화 작업을 사용할 것입니다.이렇게 하면 프로그램이 닫혀야 한다면, 다시 시작하면, 모든 기존 작업이 존재합니다.또한 응용 프로그램이 여러 개의 실례가 실행되고 있다면 데이터베이스는 유일한 실제 원천이 되고 모든 실례가 작업을 반복하는 것을 방지할 수 있습니다.
SQL 데이터베이스를 사용하려면 Hangfire를 설치합니다.SqlServer를 포장하여 services.AddHangfire(c => c.UserMemoryStorage())Startup.ConfigureServices 로 교체합니다.
services.AddHangfire(c => c
  .UseSqlServerStorage(Configuration.GetConnectionString("HangfireConnection"), new SqlServerStorageOptions
  {
    CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
    SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
    QueuePollInterval = TimeSpan.Zero,
    UseRecommendedIsolationLevel = true,
    DisableGlobalLocks = true
  }));
이 설정은 Hangfire에서 권장하는 기본 설정입니다. 예를 들어 이 설정을 변경해야 할 수도 있습니다.
마지막으로 appsettings.json 파일로 이동하여 Hangfire 데이터베이스에 연결 문자열을 추가합니다.
"ConnectionStrings": {
  "HangfireConnection": "Server=.\\sqlexpress;Database=HangfireTest;Integrated Security=SSPI;"
}
이것은 하나의 예다.자신의 데이터베이스 자격 증명을 사용하십시오.
이렇게현재 Hangfire에 작업을 제출하면 이 작업은 SQL 데이터베이스에 오래 유지됩니다.

결론


본고에서 ASP에서 백그라운드 작업과 반복 작업을 실행하기 위해 Hangfire를 설정하는 방법을 보여 드리겠습니다.NET 핵심 웹 응용 프로그램.더 복잡한 작업을 수행할 수 있도록 클래스를 작업에 주입하는 방법을 보여 드리겠습니다.마지막으로 SQL 데이터베이스를 사용하여 이러한 작업을 지속하는 방법을 보여 드리겠습니다.
나의 게시물은 대부분 전 창고에 관한 것이다.NET 및 Vue 웹 개발어떤 댓글도 놓치지 않도록 본 블로그와 subscribe to my newsletter를 팔로우하세요.만약 이 글이 매우 도움이 된다고 생각한다면, 좋아하고 공유하세요.너도 위에서 나를 찾을 수 있다.만약 네가 원한다면, 너도 할 수 있다buy me a coffee!😊

좋은 웹페이지 즐겨찾기