매일 밤 03:00에 이벤트를 트리거하는 방법?
-
18-09-2019 - |
문제
이것이 어떻게 가장 잘 이루어 집니까? 서버에서 실행중인 앱이 매일 밤 03:00에 이벤트를 트리거하기를 원합니다.
해결책
Windows 작업 스케줄러를 사용하십시오
다른 팁
작업 스케줄러를 사용하는 대신 앱 코드 실행 에서이 작업을 수행하려면 앱이 상당히 긴 (예 : 1 시간 또는 3,600 초)로 잠을 자도록하는 기간을 선택해야합니다. 앱이 반복되고 각 수면 호출이 만료되면 앱은 마감 시간 (03:00)까지 얼마나 많은 시간이 남아 있는지 확인합니다. 나머지 수면 시간이 거친 간격 시간 이하로되면 짧은 간격으로 줄여야합니다 (매번 절반 또는 10 초로 감소). 대상 마감 시간에 도달 할 때까지 루프, 수면 및 간격 시간을 줄입니다.
이로 인해 루프가 너무 자주 깨어나는 것을 방지하지만 (86,400 1- SEC 간격은 과잉입니다), 너무 오래 자면서 앱 루프가 대상 마감 시간을 오버 슈팅하는 것을 방지합니다.
1 초의 간격으로 타이머를 만들 수 있고 타이머가 꺼지면 3:00인지 확인하십시오.
기계에 로그인 한 사람이 없어도 실행되도록 서비스에 구축해야하며 트리거가 발생하도록하는 다양한 방법이 있습니다.
a를 만드는 것을 고려하십시오 System.Timers.Timer
어디에 Interval
간의 차이로 설정됩니다 DateTime.Now
그리고 다음 3:00.
여기에는 두 가지 기본 옵션이 있습니다.
기존 서비스 내 에서이 작업을 수행하려는 경우 시간제 노동자 매일 밤 3시에 자신을 트리거하고 "작업"을 실행합니다.
즉, 이것은 일반적으로 Windows 작업 스케줄러. 응용 프로그램을 24/7로 유지하는 대신 매일 3시에 한 번 실행하도록 예약하십시오.
편집하다:
코드에서 작업 스케줄러와 함께 작업 해야하는 경우 (다른 의견에 언급) 가능합니다. 작업 스케줄러가 제공합니다 API 개별 작업을 설정하기 위해 (Itask) 작업 스케줄러를 통해 (ItaskScheduler).
그러나 XP Embedded에서 작업한다는 점을 감안할 때 일반 시스템 구성 기능을 사용하고 매일 한 번 실행할 작업을 설정하는 것이 좋습니다. 임베디드 시스템에서는 배포하는 동안 충분히 제어 할 수 있어야합니다.
다음은 테이블을보기 위해 60 초마다 타이머를 실행하는 단순화 된 서비스 버전입니다. 타이머 ELAPSE 이벤트를 변경하여 시간을 확인하고 실행할 수 있습니다.
Dim Timer As System.Timers.Timer
Protected Overrides Sub OnStart(ByVal args() As String)
Timer = New System.Timers.Timer(60000)
AddHandler Timer.Elapsed, AddressOf timer_Elapsed
Timer.Start()
End Sub
Protected Overrides Sub OnStop()
Timer2.Stop()
End Sub
Private Sub timer_Elapsed(ByVal pSender As Object, ByVal pargs As System.Timers.ElapsedEventArgs)
'Ensure the tick happens in the middle of the minute
If DateTime.Now.Second < 25 Then
Timer.Interval = 65000
ElseIf DateTime.Now.Second > 35 Then
Timer.Interval = 55000
ElseIf DateTime.Now.Second >= 25 And DateTime.Now.Second <= 35 Then
Timer.Interval = 60000
End If
'Logic goes here
End Sub
분명히, 가능하다면 여기 다른 사람들이 언급 한 작업 스케줄러를 사용하십시오. 이 작업을 선호하는 방법입니다. 방금이 코드를 놓았으므로 도움이 될 수있는 경우 게시 할 것이라고 생각했습니다. 또한이 코드는 외부 소스가 언제 테이블을 편집 할 것인지 전혀 몰랐기 때문에 우리에게 효과적이었습니다. MD5SUM에서 지적한 바와 같이 간격을 올바른 수의 밀리 초로 설정하는 것은 훨씬 더 효율적인 방법입니다.
이 답변은 약간 남은 필드 일 수 있지만 우리는 종종 사용합니다. cruisecontrol.net 예정된 작업 중 일부. 그것은 그들 모두에게 완벽하지는 않지만 매일 밤 실행하고 다른 코드/결과가 그것에 의존하는 큰 일이라면 좋은 선택입니다. 언제든지 실행할 수 있도록 일정을 잡을 수 있고, 작동/실패한 경우 이메일을받을 수 있습니다. 다른 스크립트/코드가 작동하지 않으면 시작하고 시작하기 전에 필요한 파일을 정리하십시오.
모든 상황에 대한 완벽한 해결책은 아니지만, 그것을 요구하는 사람들에게는 강력합니다. 우리는 빅 데이터 처리 작업 중 일부를 사용하며, 효과가 있거나 실패한 경우 모든 이메일을 보내고 처음 실패하면 30 분 후에 다시 시도 할 것입니다. 그것은 당신에게 멋진 퍼지 느낌을줍니다 :)
Windows 작업 스케줄러 (Klausbyskov가 제안한대로) 또는 SQL 서버 작업.
편집하다:
또는 Dyanically 지정된 시간을 원한다면 10 분마다 투표하고 원하는 시간에 약간의 작업을 수행하는 Windows 서비스를 만들 수 있습니다.
C#에서 Windows 서버 생성 상당히 사소하고 이것을 할 수 있습니다. 보안과 로깅이 실행 중이거나 실행중인 상태에서 무슨 일이 일어나고 있는지 말하기가 어려울 수 있기 때문에 보안과 로깅이 알아 져야합니다.
예정된 작업을 수행하기 위해 ASP.NET 애플리케이션에서 스레드를 생산하고 있습니다.
프로그램이 명령 줄을 통해 실행할 수 있습니까? 그렇다면 foo.bat 파일을 만들고 프로그램 명령 줄을 호출하십시오 (매우 간단합니다).
그런 다음 사용하십시오 작업 스케줄러 매일 오전 3시에 .bat 파일을 실행하려면.