programing

예약된 작업을 실행하는 가장 좋은 방법

showcode 2023. 5. 5. 10:01
반응형

예약된 작업을 실행하는 가장 좋은 방법

오늘 우리는 ASP에 대해 예약된 작업을 실행하기 위한 콘솔 응용 프로그램을 만들었습니다.NET 웹사이트.하지만 저는 이 접근 방식이 약간 오류가 발생하기 쉽고 유지하기 어렵다고 생각합니다.예약된 작업을 실행하는 방법(윈도우즈/IIS/ASP).NET 환경)

업데이트:

작업의 예:

  • 데이터베이스의 전자 메일 대기열에서 전자 메일 보내기
  • 데이터베이스에서 오래된 개체 제거
  • Google AdWords에서 통계를 검색하고 데이터베이스의 테이블을 채우는 중입니다.

제프 앳우드의 스택 오버플로 기술은 제가 본 것 중 가장 간단한 방법입니다.ASP에 "캐시 항목 제거" 콜백 메커니즘이 내장되어 있어야 합니다.NET의 캐시 시스템

업데이트: 스택 오버플로가 이 메서드를 초과했습니다.웹사이트가 실행되는 동안에만 작동하지만 많은 사람들에게 유용한 매우 간단한 기술입니다.

Quartz도 확인해 보십시오.NET

웹 사이트에 대한 모든 작업(예약해야 함)은 웹 사이트 내에 보관되고 특수 페이지에서 호출됩니다.그리고 나서 저는 이 페이지에 자주 전화를 거는 간단한 윈도우 서비스를 만들었습니다.페이지가 실행되면 값이 반환됩니다.처리해야 할 작업이 더 많다는 것을 알면 페이지를 바로 다시 실행하고, 그렇지 않으면 잠시 후에 실행합니다.이것은 저에게 정말 잘 작동했고 웹 코드로 제 모든 작업 논리를 유지합니다.간단한 Windows 서비스를 작성하기 전에 Windows 스케줄러를 사용하여 x분마다 페이지를 호출했습니다.

이것을 실행하는 또 다른 편리한 방법은 Pingdom과 같은 모니터링 서비스를 사용하는 것입니다.서비스 코드를 실행하는 페이지를 http 체크로 가리킵니다.페이지가 결과를 반환하도록 합니다. 그러면 Pingdom이 잘못된 경우 경고 메시지를 보내도록 트리거할 수 있습니다.

사용자 지정 윈도우즈 서비스를 생성합니다.

몇 가지 미션 크리티컬 작업을 예약된 콘솔 앱으로 설정했지만 유지 관리가 어렵다는 것을 알게 되었습니다.몇 분마다 DB의 일정을 확인하는 '하트비트'로 Windows 서비스를 만들었습니다.정말 잘 풀렸어요.

하지만 저는 여전히 중요하지 않은 대부분의 유지보수 작업에 예약된 콘솔 앱을 사용하고 있습니다.고장나지 않았다면 고치지 마세요.

관련된 모든 사람들이 이 작업을 쉽게 수행할 수 있습니다.

  • DoSuchAndSuchProcess와 같은 웹 서비스 메서드 만들기
  • 이 웹 메서드를 호출하는 콘솔 앱을 만듭니다.
  • 작업 스케줄러에서 콘솔 앱을 예약합니다.

이 방법론을 사용하면 모든 비즈니스 로직이 웹 앱에 포함되지만 Windows 작업 관리자나 다른 상용 작업 관리자의 신뢰성을 확보하여 실행 보고서와 같은 반환 정보를 기록할 수 있습니다.페이지에 게시하는 대신 웹 서비스를 사용하는 것은 웹 서비스에서 반환 데이터를 얻는 것이 더 쉽기 때문에 약간의 이점이 있습니다.

왜 바퀴를 재창조해야 하는지, 스레드화 및 타이머 클래스를 사용하십시오.

    protected void Application_Start()
    {
        Thread thread = new Thread(new ThreadStart(ThreadFunc));
        thread.IsBackground = true;
        thread.Name = "ThreadFunc";
        thread.Start();
    }

    protected void ThreadFunc()
    {
        System.Timers.Timer t = new System.Timers.Timer();
        t.Elapsed += new System.Timers.ElapsedEventHandler(TimerWorker);
        t.Interval = 10000;
        t.Enabled = true;
        t.AutoReset = true;
        t.Start();
    }

    protected void TimerWorker(object sender, System.Timers.ElapsedEventArgs e)
    {
        //work args
    }

Windows 스케줄러를 사용하여 웹 페이지를 실행합니다.

악의적인 사용자나 검색 엔진 스파이더가 실행되지 않도록 하려면 예약된 작업을 설정할 때 쿼리 문자열(예: mypage.aspx?from=task)로 웹 페이지를 호출하기만 하면 됩니다.

그런 다음 페이지 로드에서 조건: if (Request)를 사용합니다.쿼리 문자열["from"] == "fromtask") { //querytask }

이렇게 하면 검색 엔진 스파이더나 악의적인 사용자가 예약된 작업을 실행할 수 없습니다.

도서관은 매력적으로 작동합니다. http://www.codeproject.com/KB/cs/tsnewlib.aspx

를 통해 윈도우즈 예약 작업을 직접 관리할 수 있습니다.NET 코드.

또한 응용 프로그램에서 SQL SERVER를 사용하는 경우 SQL 에이전트를 사용하여 태스크를 예약할 수 있습니다.여기에는 일반적으로 데이터 기반 코드(전자 메일 알림, 예약된 유지보수, 제거 등)가 포함됩니다.SQL 에이전트에 기본으로 제공되는 주요 기능은 오류 알림 옵션으로, 중요한 태스크가 실패할 경우 사용자에게 이를 참조하십시오.

어떤 종류의 예약된 작업을 말씀하시는 건지 잘 모르겠습니다."매시간, foo.xml 새로 고침" 유형의 작업을 의미하는 경우 Windows 예약된 작업 시스템을 사용합니다.("at" 명령 또는 컨트롤러를 통해)콘솔 앱을 실행하게 하거나 프로세스를 시작하는 특수 페이지를 요청합니다.

편집: 추가해야 합니다. 이것은 예약된 시점에서 IIS 앱을 실행할 수 있는 좋은 방법이기도 합니다.따라서 30분마다 DB를 확인하고 사용자에게 일부 데이터에 대한 주의사항을 전자 메일로 보내려고 하면 예약된 작업을 사용하여 이 페이지를 요청하여 IIS 처리 항목을 가져올 수 있습니다.

요구 사항이 더 복잡할 경우 Windows 서비스를 생성하고 필요한 모든 처리를 수행하기 위해 루프를 실행하는 것을 고려할 수 있습니다.이는 확장 또는 관리 목적을 위해 코드를 분리하는 이점도 있습니다.단점은 Windows 서비스를 처리해야 한다는 것입니다.

서버를 소유한 경우 윈도우즈 태스크 스케줄러를 사용해야 합니다.옵션을 보려면 명령줄에서 AT /?를 사용합니다.

그렇지 않으면 웹 기반 환경에서 특정 페이지에 일정 간격으로 요청하도록 다른 컴퓨터를 설정하는 등의 불쾌한 작업을 수행해야 할 수 있습니다.

저는 아비다르를 ASP에서 성공적으로 사용했습니다.NET 프로젝트(배경 정보).

이 방법의 유일한 문제는 ASP인 경우 태스크가 실행되지 않는다는 것입니다.NET 웹 응용 프로그램이 메모리에서 언로드됩니다(사용률이 낮아짐).한 가지 시도한 것은 5분마다 웹 응용 프로그램을 실행하는 작업을 만드는 것이었는데, 이 작업이 안정적으로 작동하지 않는 것 같아서 Windows 스케줄러와 기본 콘솔 응용 프로그램을 사용하여 대신 이 작업을 수행하고 있습니다.

이상적인 솔루션은 Windows 서비스를 만드는 것이지만, 이는 불가능할 수 있습니다(예: 공유 호스팅 환경을 사용하는 경우).또한 웹 애플리케이션 내에서 유지 관리의 관점에서 작업을 조금 더 쉽게 수행할 수 있습니다.

다른 방법이 있습니다.

시작 기한이 지났거나 기한이 지난 작업을 시작하는 "하트비트" 웹 스크립트를 만듭니다.

웹스크립트를 누르고 일정한 간격으로 실행하도록 강제하는 예약된 프로세스를 어딘가에 만듭니다(같은 웹 서버에서 하는 것이 좋습니다).(예: IE 또는 what have you를 사용하여 히트비트 스크립트를 조용히 시작하는 Windows 스케줄 작업)

작업 코드가 웹 스크립트 내에 포함되어 있다는 사실은 순전히 웹 응용 프로그램 코드 기반 에서 코드를 유지하기 위한 것입니다(둘 다 서로 종속되어 있다는 가정). 웹 개발자가 관리하기가 더 쉬울 것입니다.

다른 접근 방식은 모든 예약 작업을 자체적으로 수행하고 예약된 작업으로 실행 파일 자체를 실행하는 실행 가능한 서버 스크립트/프로그램을 만드는 것입니다.이를 통해 웹 응용 프로그램과 예약된 작업 간의 기본적인 디커플링이 가능합니다.따라서 웹 앱/데이터베이스가 다운되거나 액세스할 수 없는 경우에도 예약된 작업을 실행해야 하는 경우 이 방법을 사용해야 합니다.

'스레드풀'을 사용하여 주기적으로 코드를 실행하는 Windows 서비스를 쉽게 만들 수 있습니다.RegisterWaitForSingleObject' 메서드를 등록합니다.그것은 정말 매끄럽고 설치하기가 꽤 쉽습니다.이 방법은 프레임워크에서 타이머를 사용하는 것보다 더 능률적인 방법입니다.

자세한 내용은 아래 링크를 참조하십시오.

에서 주기적 프로세스 실행.Windows 서비스를 사용하는 NET:
http://allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html

콘솔 애플리케이션도 사용합니다.Log4net과 같은 로깅 도구를 사용하면 해당 도구의 실행을 제대로 모니터링할 수 있습니다.또한 웹 페이지보다 관리하기가 얼마나 어려운지 잘 모르겠습니다. 올바르게 설계된 경우 두 웹 페이지 간에 동일한 코드 라이브러리를 공유하고 있을 수 있기 때문입니다.

이러한 작업을 시간에 따라 실행하는 것에 반대하는 경우 웹 사이트의 관리 섹션에 대기열 역할을 하는 웹 페이지가 있을 수 있습니다.사용자가 작업 실행 요청을 입력하면 MyProcess에 빈 날짜 스탬프 레코드가 삽입됩니다.테이블 대기열 및 예약된 작업은 X분마다 MyProcess에서 새 레코드를 확인하는 중입니다.큐. 그래야 고객이 원하는 경우에만 실행됩니다.

그 제안들이 도움이 되길 바랍니다.

한 가지 옵션은 Windows 서비스를 설정하여 예약된 작업을 호출하는 것입니다.

제가 사용한 winforms에서 Timers는 이것이 ASP에서 잘 작동하지 않을 것이라고 생각합니다.그물

에 대한 새 작업 스케줄러 클래스 라이브러리.그물

참고: 이 라이브러리가 만들어진 이후 Microsoft는 Windows Vista용 새 작업 스케줄러(작업 스케줄러 2.0)를 도입했습니다.이 라이브러리는 작업 스케줄러 1.0 인터페이스의 래퍼로, Vista에서 여전히 사용할 수 있으며 Windows XP, Windows Server 2003 및 Windows 2000과 호환됩니다.

http://www.codeproject.com/KB/cs/tsnewlib.aspx

언급URL : https://stackoverflow.com/questions/542804/best-way-to-run-scheduled-tasks

반응형