단순 지침 노동자 서비스.그물심

21779 단어 dotnet

노동자 서비스



NET는 결국 완전한 프레임워크처럼 느껴집니다. RESTful API를 구축할 수 있습니다.콘솔 애플리케이션,백그라운드 서비스,네트워크 전단;가장 중요한 것은 Windows 서비스입니다. 타사 소프트웨어가 필요하지 않습니다.
노동자 서비스는 무료다.NET의 백그라운드 서비스이것은 장시간 운행하는 서비스를 만들거나 일정한 시간 간격으로 시작해야 하는 완벽한 방식이다.
새로운 기술의 출현에 따라.NET Core 3.0, TopShelf와 같은 타사 도구가 필요 없는 Windows 서비스로 엔지니어 서비스를 만들고 설치할 수 있습니다.

개시하다


Visual Studio의 최신 버전에는 워커 서비스 템플릿이 포함되어 있습니다. 이 템플릿에서 워커 서비스 항목을 만들고 SimpleFarm으로 명명합니다.
농장은 매우 좋은 예시 항목으로 노동자 서비스의 개념을 설명할 수 있다. 왜냐하면 농장에 대해 당신은
  • 정해진 시간 간격으로 작업,
  • , 그리고 설정된 순서대로.


  • 구성 설정


    우선, 우리 그것의 묘미를 이야기합시다.NET 처리 config.프로젝트에 구성 폴더를 만들고 다음 클래스를 추가합니다.
    public class FarmConfig
    {
       public int TillTimeInMinutes { get; set; }
       public int PlantTimeInMinutes { get; set; }
       public int HarvestTimeInMinutes { get; set; }
       public int FertileLandInMetersSquared { get; set; }
       public string Crop { get; set; }
    }
    
    appsettings.json 파일은 모든 구성 설정을 저장하는 곳입니다. - 다음 항목을 사용하여 파일을 업데이트합니다.
    ...
    "Farm": {
      "TillTimeInMinutes": 3,
      "PlantTimeInMinutes": 3,
      "HarvestTimeInMinutes": 3,
      "FertileLandInMetersSquared": 100,
      "Crop": "Grain"
    } 
    ...
    
    우리는 100평방미터의 땅에 곡물을 재배할 것이다.우리는 토지를 3분 동안 경작하고 작물을 3분 동안 재배한 후에 3분 안에 수확할 것이다.

    프로세스 설정


    농업 논리는 워커 서비스에서 직접 호출되지 않고 내가 호출하는 프로세스를 좋아하는 클래스로 옮겨진다.프로젝트에 프로세스 폴더를 만들고 다음 인터페이스와 클래스를 추가합니다.
    public interface IFarmingProcess
    {
       Task TillTheLand();
       Task PlantTheCrop();
       Task HarvestTheCrop();
    }
    

    public class FarmingProcess : IFarmingProcess
    {
       private readonly FarmConfig config;
       private readonly ILogger<FarmingProcess> logger;
    
       public FarmingProcess(IOptions<FarmConfig> config, ILogger<FarmingProcess> logger)
       {
          this.config = config.Value;
          this.logger = logger;
       }
    
       public async Task TillTheLand()
       {
          logger.LogInformation($"Tilling {config.FertileLandInMetersSquared} m^2 for {config.Crop} crop!!!");
          await Task.Delay(TimeSpan.FromMinutes(config.TillTimeInMinutes));
       }
    
       public async Task PlantTheCrop()
       {
          logger.LogInformation($"Planting {config.FertileLandInMetersSquared} m^2 for {config.Crop} crop!!!");
          await Task.Delay(TimeSpan.FromMinutes(config.PlantTimeInMinutes));
       }
    
       public async Task HarvestTheCrop()
       {
          logger.LogInformation($"Harvesting {config.FertileLandInMetersSquared} m^2 for {config.Crop} crop!!!");
          await Task.Delay(TimeSpan.FromMinutes(config.HarvestTimeInMinutes));
       }
    }
    
    IOptions<FarmConfig> config의 구조 함수 중의 FarmingProcess 매개 변수는 how이다.NET 코어 주입 구성.Startup.cs 파일에서 Dependency Injection 용기의 내용을 정의하면 이 모든 것이 연결됩니다.

    노동자를 배치하다


    지금, 우리는 우리의 노동자 서비스를 세울 것이다.작업 폴더를 만들고 다음 클래스를 추가합니다.
    public class FarmWorker : BackgroundService
    {
       private readonly IFarmingProcess farmingProcess;
       private readonly ILogger<FarmWorker> logger;
    
       public FarmWorker(IFarmingProcess farmingProcess, ILogger<FarmWorker> logger)
       {
          this.farmingProcess = farmingProcess;
          this.logger = logger;
       }
    
       protected override async Task ExecuteAsync(CancellationToken stoppingToken)
       {
          // This is how we keep the app running (in the background)
          while (!stoppingToken.IsCancellationRequested)
          {
             logger.LogInformation("FarmWorker running at: {time}", DateTimeOffset.Now);
    
         await farmingProcess.TillTheLand();
         await farmingProcess.PlantTheCrop();
         await farmingProcess.HarvestTheCrop();
          }
       }
    }
    
    이것은 일꾼 서비스로 BackgroundService류를 계승하고 ExecuteAsync(...)류를 다시 써서 만든 것이다.
    프로그램이 실행될 때, 백엔드에서 ExecuteAsync(...)을 실행합니다.ExecuteAsync(...) 루프를 while (!stoppingToken.IsCancellationRequested) {...} 루프로 포장하여 애플리케이션이 종료되고 취소 요청이 있을 때만 작업을 계속 실행/처리할 수 있도록 합니다.

    애플리케이션 호스트 설정


    마지막으로 우리는 호스트를 설정했다.프로젝트에 다음 Nuget 패키지를 추가하여 Windows 서비스로 설치합니다.

    Microsoft.Extensions.Hosting.WindowsServices


    이제 Program.cs 파일에서 모든 컨텐트를 삭제하고 다음 컨텐트로 바꿉니다.
    public class Program
    {
       public static void Main(string[] args) => CreateHostBuilder(args).Build().Run();
    
       public static IHostBuilder CreateHostBuilder(string[] args) =>
          Host.CreateDefaultBuilder(args)
              .ConfigureLogging(logging =>
              {
                 logging.ClearProviders();
                 logging.AddConsole();
                             logging.AddEventLog();
              })
              // Essential to run this as a window service
              .UseWindowsService()
              .ConfigureServices(configureServices);
    
       private static void configureServices(HostBuilderContext context, IServiceCollection services)
       {
          services.Configure<FarmConfig>(context.Configuration.GetSection("Farm"));
          services.AddLogging();
          services.AddSingleton<IFarmingProcess, FarmingProcess>();
          services.AddHostedService<FarmWorker>();
       }
    }
    
    마지막으로, "Logging"appsettings.json 속성에 다음을 추가합니다.
      "Logging": {
    ...
        "EventLog": {
          "LogLevel": {
            "Default": "Information",
            "Microsoft.Hosting.Lifetime": "Information"
          }
        }
      },
    
    이곳에서 매우 중요한 일이 네 건 발생했다.
    1) .UseWindowsService()에서는 Worker 서비스를 Windows 서비스로 설치할 수 있습니다.
    2) context.Configurationappsettings.json 파일에 설정된 구성에 액세스하는 방법입니다.
    3) services.AddHostedService<FarmWorker>()은 보조 서비스를 애플리케이션 호스트 프로세스에 연결하는 방법입니다.
    4) logging.AddEventLog()은 Windows 이벤트 로그에 메시지를 직접 기록하여 보조 서비스가 실제로 작동하는지 확인합니다.
    로그 기록을 Windows 이벤트 로그로 구성하려면 appsettings.json을 업데이트해야 합니다.

    응용 프로그램을 실행할 때 세 가지 농경 과정을 모두 마친 후 컨트롤러는 다음과 유사해야 한다.

    Windows 서비스로 설치


    위대하다우리는 현재 워커 서비스를 가지고 있다. 워커 서비스는 설정된 시간 간격에 따라 데이터를 처리하고, SQL 정리 명령을 실행할 수 있으며, 심지어는 경작도 할 수 있다.
    이 보조 서비스는 실행 중인 모든 프로그램에 추가할 수 있습니다.NET 코어 호스트 - ASP 1개NET Core API는 이를 실현하기 좋은 장소이거나 Windows 서비스로 간편하게 설치하고 자체적으로 실행할 수 있습니다.
    Windows 서비스로 설치하려면 솔루션의 루트에서 명령행 셸을 실행하고
    dotnet build
    
    그 다음으로 Windows에서 서비스 창설(sc) 도구를 사용하여 Worker 서비스를 Windows 서비스로 설치한다.나는 PowerShell을 사용하는 것을 건의합니다.관리자로 명령줄 셸을 실행하고 다음 스크립트/명령을 실행합니다.
    sc.exe create FarmWorkerService binPath=C:\...\path to your solution\SimpleFarm\SimpleFarm\bin\Debug\netcoreapp3.1\SimpleFarm.exe
    
    당신의 서비스가 이미 창설되었습니다!하지만 아직 운행되지 않았다.
    Windows에서 서비스 응용 프로그램을 열고 이름 - FarmWorker Service로 서비스를 찾습니다.너는 반드시 유사한 물건을 보아야 한다.

    서비스 UI를 통해 FarmWorker Service를 관리하거나 콘솔에서 다음 3가지 명령을 사용하여 관리할 수 있습니다.
  • sc.exe start DemoWorkerService 시작 서비스
  • sc.exe stop DemoWorkerService 서비스 중단

  • 삭제 서비스
  • 서비스 작성 명령줄 도구를 사용하여 서비스를 시작하거나 서비스 UI를 사용하여 서비스를 시작합니다.Farmworker 서비스가 실행 중일 것입니다!

    서비스가 실제로 실행 중인지 확인하려면 윈도우즈에서 이벤트 뷰어 프로그램을 열고...

    즐겁게 천천히 걷는 거 봐!
    git hub link to the SimpleFarm project

    좋은 웹페이지 즐겨찾기