반복 작업의 주기를 설정하기 위한 방법으로 사용하는 형식을 나타낸다.
반복 주기를 나타내는 문자열 형식은 다음과 같다. 첫번째 열부터 분, 시간, 일, 월, 요일 을 나타낸다.

분 (minute) : 0 ~ 59
시 (hour) : 0 ~ 23
일 (day of month) : 1 ~ 31
월 (month) : 1 ~ 12
요일 (day of week): 0 ~ 7 (일요일이 0)
        public void InvalidTimeFormat()
        {
            const string PeriodFmt = "a b c 0,12 * * *";

            var lastTime = new DateTime(2007, 3, 28, 11, 55, 0);
            var currTime = new DateTime(2007, 3, 28, 11, 55, 0);

            Assert.Throws <InvalidOperationException>(() => PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime));
        }
        public void HourPeriodTest()
        {
            // 12시에 작업을 수행한다.
            const string PeriodFormat = "0 12 * * *";

            var lastTime = new DateTime(2007, 3, 28, 11, 55, 0);
            var currTime = new DateTime(2007, 3, 28, 11, 55, 0);

            Assert.IsFalse(PeriodTimeFormat.IsExpired(PeriodFormat, lastTime, currTime));
            Assert.IsFalse(PeriodTimeFormat.IsExpired(PeriodFormat, lastTime, currTime.AddMinutes(4)));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(PeriodFormat, lastTime, currTime.AddMinutes(10)));
        }
        public void MinutePeriodTest()
        {
            // 매시 5분에 작업을 수행한다.
            const string PeriodFmt = "5 * * * *";

            var lastTime = new DateTime(2007, 3, 28, 12, 4, 0);
            var currTime = new DateTime(2007, 3, 28, 12, 4, 55);

            Assert.IsFalse(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime));
            Assert.IsFalse(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime.AddSeconds(4)));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime.AddMinutes(1)));
        }
Example #4
0
        /// <summary>
        /// 반복 주기에 따라 지정된 Action을 비동기 방식으로 작업을 수행합니다.
        /// </summary>
        /// <param name="periodTimeFormat">주기 표현식</param>
        /// <param name="idleTimeSpan">유휴 시간 간격</param>
        /// <param name="periodAction">주기 도래시 수행할 델리게이트</param>
        /// <param name="token">취소시 필요한 토큰</param>
        protected virtual void DoInvokeByPeriodTime(string periodTimeFormat, TimeSpan idleTimeSpan, Action <object> periodAction,
                                                    CancellationToken token)
        {
            periodAction.ShouldNotBeNull("periodAction");

            if (IsDebugEnabled)
            {
                log.Debug("반복 주기에 따라 지정된 Action을 비동기 방식으로 수행하는 작업을 시작합니다... periodTimeFormat=[{0}]", periodTimeFormat);
            }

            var previousTime = DateTime.MinValue;

            while (token.IsCancellationRequested == false)
            {
                var currentTime = DateTime.Now;

                if (PeriodTimeFormat.IsExpired(periodTimeFormat, previousTime, currentTime))
                {
                    if (IsDebugEnabled)
                    {
                        log.Debug("반복 주기에 도래하여, 지정된 Action을 수행을 시작합니다... " +
                                  "periodTimeFormat=[{0}], previousTime=[{1}], currentTime=[{2}]",
                                  periodTimeFormat, periodAction, currentTime);
                    }

                    With.TryActionAsync(
                        () => Task.Factory.StartNew(periodAction, token, TaskCreationOptions.PreferFairness).Wait(token),
                        age => {
                        if (IsDebugEnabled)
                        {
                            log.Debug("작업 실행 중에 중단 요청에 의해 실행 취소되었습니다...");
                        }

                        age.Handle(ex => token.IsCancellationRequested);
                    });

                    previousTime = currentTime;

                    if (IsDebugEnabled)
                    {
                        log.Debug("반복 주기에 도래하여, 지정된 Action을 수행을 완료하였습니다!!! " +
                                  "periodTimeFormat=[{0}], previousTime=[{1}], currentTime=[{2}]",
                                  periodTimeFormat, periodAction, DateTime.Now);
                    }
                }

                if (token.IsCancellationRequested == false)
                {
                    token.WaitHandle.WaitOne(idleTimeSpan);
                }
            }
        }
        public void MinutePeriodTest3()
        {
            // 매 10분마다 수행한다.
            const string PeriodFmt = "0,10,20,30,40,50 12 * * *";

            var lastTime = new DateTime(2007, 3, 28, 12, 5, 0);
            var currTime = new DateTime(2007, 3, 28, 12, 9, 55);

            Assert.IsFalse(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime));
            Assert.IsFalse(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime.AddSeconds(4)));
            Assert.IsFalse(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime.AddMinutes(-5)));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime.AddMinutes(1)));

            Assert.IsTrue(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime.AddMinutes(10), currTime.AddMinutes(11)));
        }
        public void WeekPeriodTest2()
        {
            const string PeriodFmt = "7 4 * * 6";

            var lastTime = new DateTime(2007, 3, 28, 11, 55, 0);
            var currTime = new DateTime(2007, 3, 31, 11, 55, 0);

            Assert.IsFalse(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime.AddDays(4)));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime.AddDays(10)));

            Assert.IsFalse(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime.AddDays(-5)));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime.AddDays(5)));

            Assert.IsTrue(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime.AddDays(5), currTime.AddDays(13)));
        }
        public void HourPeriodTest2()
        {
            // 매 12시간마다 수행한다.
            const string PeriodFmt = "0 0,12 * * *";

            var lastTime = new DateTime(2007, 3, 28, 11, 55, 0);
            var currTime = new DateTime(2007, 3, 28, 11, 55, 0);

            Assert.IsFalse(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime));
            Assert.IsFalse(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime.AddMinutes(4)));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime.AddMinutes(10)));

            Assert.IsFalse(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime.AddMinutes(-5)));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime, currTime.AddMinutes(5)));

            Assert.IsTrue(PeriodTimeFormat.IsExpired(PeriodFmt, lastTime.AddHours(5), currTime.AddHours(13)));
        }
        public void IsExpiredByMinutes()
        {
            // 매시 1분에
            var periodFormat = "1 * * * *";
            var getTime      = DateTime.Today;

            Assert.IsFalse(PeriodTimeFormat.IsExpired(periodFormat, getTime, getTime.AddSeconds(30)));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(periodFormat, getTime, getTime.AddMinutes(1)));

            // 매시 5분에
            periodFormat = "5 * * * *";
            Assert.IsFalse(PeriodTimeFormat.IsExpired(periodFormat, getTime, getTime.AddMinutes(4)));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(periodFormat, getTime, getTime.AddMinutes(5)));

            // 5분마다
            periodFormat = "0,5,10,15,20,25,30,35,40,45,50,55 * * * *";
            Assert.IsFalse(PeriodTimeFormat.IsExpired(periodFormat, getTime, getTime.AddMinutes(4)));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(periodFormat, getTime, getTime.AddMinutes(5)));
        }
        public void IsExpiredByHour()
        {
            // 매일 1시 정각에
            var periodFormat = "0 1 * * *";
            var getTime      = DateTime.Today;

            Assert.IsFalse(PeriodTimeFormat.IsExpired(periodFormat, getTime, getTime.AddMinutes(30)));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(periodFormat, getTime, getTime.AddHours(1)));

            // 매일 6시 정각에
            periodFormat = "0 6 * * *";
            Assert.IsFalse(PeriodTimeFormat.IsExpired(periodFormat, getTime, getTime.AddHours(5)));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(periodFormat, getTime, getTime.AddHours(6)));

            // 매일 6시간마다
            periodFormat = "0 0,6,12,18 * * *";
            Assert.IsFalse(PeriodTimeFormat.IsExpired(periodFormat, getTime, getTime.AddHours(5)));
            Assert.IsTrue(PeriodTimeFormat.IsExpired(periodFormat, getTime, getTime.AddHours(6)));
        }