Quartz 및 Cron 트리거를 사용하여 .NET 8에서 작업 자동화

Quartz 및 Cron 트리거를 사용하여 .NET 8에서 작업 자동화

개발자라면 이메일 보내기, 보고서 생성, 일정에 따른 데이터 정리 등 자동화하고 싶은 작업이 있을 것입니다.

그렇다면 어떻게 그렇게 할 수 있나요?

바로 그곳이다 서비스 들어오세요. 자동화를 효율적이고 안정적으로 처리할 수 있는 좋은 방법입니다.

서비스를 사용하여 이를 설정하는 방법을 분석해 보겠습니다.

소개

Quartz는 일정 관리 및 자동화를 위한 인기 있는 오픈 소스 도구입니다.

그 중심에는 석영 트리거두 가지 모두에서 사용할 수 있는 강력한 작업 예약 라이브러리인 Quartz Scheduler의 핵심 구성 요소입니다. 기음# 그리고 자바.

공식 문서: [

What is a trigger?

A Trigger defines when and how often a job should run. \n Think of it as the schedule attached to a job.

When you schedule a job in Quartz, you provide:

  • A Job (what to do)
  • A Trigger (when to do it)

Types of Quartz Triggers

  1. Simple Trigger
  • Runs a job a specific number of times or at fixed intervals.
  • Example: run every 10 seconds, repeat 5 times.

\

  1. Cron Trigger
  • Uses a Cron expression (like in Unix/Linux Cronjobs) for more complex schedules.
  • Example: run every day at 2:00 AM.

What is a Cron expression?

A Cron Expression is a string with 6 or 7 fields that defines a schedule, specifying exactly when a job should run (down to seconds). \n It’s like a compact language for time-based scheduling.

Detailed expression: you can read it in their official documents.

The requirement is to read the file every 30 seconds.

Let’s implement a Cron trigger in .NET 8.

Project Settings

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <RootNamespace>CronImplementation</RootNamespace>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Quartz" Version="3.15.1" />
    <PackageReference Include="Quartz.Plugins" Version="3.15.1" />
  </ItemGroup>

    <ItemGroup>
        <Content Include="jobs.xml" CopyToOutputDirectory="Always" />
    </ItemGroup>
</Project>

Program

using Quartz;
using Quartz.Impl;
using Quartz.Xml;
using Quartz.Simpl;  // <-- needed for SimpleTypeLoadHelper

namespace CronImplementation
{
    class Program
    {
        static async Task Main(string[] args) { //스케줄러 생성 ISchedulerFactory Factory = new StdSchedulerFactory(); IScheduler 스케줄러 = 공장을 기다리고 있습니다.GetScheduler(); //형식 로드 도우미 생성(새 API에 필요) var typeLoadHelper = new SimpleTypeLoadHelper(); typeLoadHelper.Initialize(); //새 XMLSchedulingDataProcessor 생성자 사용 var xmlProcessor = new XMLSchedulingDataProcessor(typeLoadHelper); //파일 경로가 절대 문자열인지 확인 xmlPath = Path.Combine(AppContext.BaseDirectory, "jobs.xml"); xmlProcessor.ProcessFileAndScheduleJobs(xmlPath, 스케줄러); Console.WriteLine(File.Exists(xmlPath)); //스케줄러 시작 wait Scheduler.Start(); Console.WriteLine("XML 구성을 사용하여 석영 스케줄러가 시작되었습니다. 중지하려면 아무 키나 누르십시오..."); Console.ReadKey(); 스케줄러를 기다립니다.Shutdown(); Console.WriteLine("스케줄러가 중지되었습니다."); } } }

파일 읽기 작업

using Quartz;

namespace CronImplementation
{
    public class FileReadingJob : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            string filePath = Path.Combine(AppContext.BaseDirectory, "file.txt");

            if (!File.Exists(filePath))
            {
                Console.WriteLine($"File not found: {filePath}");
                return Task.CompletedTask;
            }

            //Read all lines
            string[] lines = File.ReadAllLines(filePath);

            foreach (var line in lines)
            {
                Console.WriteLine(line);
            }
            Console.WriteLine($"FileReadingJob executed at: {DateTime.Now}");
            return Task.CompletedTask;
        }
    }
}

Jobs.xml

<?xml version="1.0" encoding="UTF-8"?>
<job-scheduling-data xmlns="
                     xmlns:xsi="
                     version="2.0">

    <!-- List of scheduled jobs -->
    <schedule>

        <!-- Job definition -->
        <job>
            <name>FileReadingJob</name>
            <group>group1</group>
            <description>Job that reads content from file</description>
            <job-type>CronImplementation.FileReadingJob, CronImplementation</job-type>
            <!-- Namespace.ClassName, Assembly -->
            <durable>true</durable>
            <recover>false</recover>
        </job>

        <!-- Trigger definition (Cron-based) -->
        <trigger>
            <cron>
                <name>FileReadingJobTrigger</name>
                <group>group1</group>
                <job-name>FileReadingJob</job-name>
                <job-group>group1</job-group>
                <cron-expression>0/10 * * * * ?</cron-expression>
                <!-- Runs every 10 seconds -->
            </cron>
        </trigger>

    </schedule>
</job-scheduling-data>

파일.txt

“이것은 콘솔 앱입니다. 이 프로젝트는 NET 8의 Cron 트리거 구현을 설명합니다.”

산출

작업 출력

요약

Quartz 트리거는 플랫폼 독립적입니다. 즉, Windows 및 Linux 서버 모두에 문제 없이 앱을 배포할 수 있습니다.

또 다른 뛰어난 기능은 여러 작업에 서로 다른 트리거 일정을 할당할 수 있어 작업 실행 방법에 더 많은 유연성을 제공한다는 것입니다.

코드를 변경할 필요 없이 XML 파일을 간단히 편집하여 트리거를 업데이트하거나 삭제할 수도 있습니다. 변경 사항을 적용하려면 서비스를 다시 시작해야 한다는 점을 명심하세요.

\

출처 참조

Post Comment

당신은 놓쳤을 수도 있습니다