0

Magento API と通信してデータを抽出する Windows サービスがあります。Windows サービスは、初めて起動したときはエラーや問題なく正常に実行されます。Windowsサービスの次回実行時刻を計算するポーラーが組み込まれており、configファイルにキー値「pollerExecutionTime」が指定されています。私が気付いたのは、Windowsサービスを自動開始タイプに設定しているにもかかわらず、スケジュールされた時間に開始されないことです。ポーラーのコードは次のとおりです。Windowsサービスのデバッグに精通していないので、誰かが私が間違っていることを教えてくれるなら、それは非常に役に立ちます。

private DateTime _nextExecutionTime;

    public DateTime NextExecutionTime
    {
        get { 

            //if(_nextExecutionTime!=null)
            //    return _nextExecutionTime;

            return _nextExecutionTime = GetNextExecutionTime(Convert.ToDateTime(ConfigurationManager.AppSettings["pollerExecutionTime"]).TimeOfDay, DateTime.Now.AddDays(1).DayOfWeek); 
        }
        set { 

            _nextExecutionTime = value; 
        }
    }

    protected override void OnStart(string[] args)
    {
        DebugMode();

        try
        {
            System.Threading.Thread.Sleep(10000);

            if (!StartService())
            {
                Stop();
            }
        }
        catch (Exception exception)
        {
            _logEntryError.Message = "OnStart: Cannot start the service due the following reason " + exception.Message + Environment.NewLine + exception.InnerException + Environment.NewLine + exception.StackTrace;

            Logger.Write(_logEntryError);
        }

        //StartService();
    }

    private bool StartService()
    {
        _timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
        _timer.Interval = 10000; //First time after 10 sec
        _timer.Enabled = true;
        _timer.AutoReset = true;

        _logEntryStart.Message = "Execution of  CheckLongtimePendingRequestsAndDelegate Method -- STARTED";

        _logEntryEnd.Message = "Execution of  CheckLongtimePendingRequestsAndDelegate Method -- ENDED";

        return true;
    }

    protected override void OnStop()
    {

    }

    [Conditional("DEBUG_SERVICE")]
    private static void DebugMode()
    {
        Debugger.Break();
    }


    private void OnElapsedTime(object source, ElapsedEventArgs e)
    {
       TimeSpan difference = NextExecutionTime.Subtract(DateTime.Now.Date);

       _timer.Interval = difference.TotalMilliseconds;

        try
        {
            Logger.Write(_logEntryStart);

            _svc.GetOrderList();
            _svc.GetCustomerList();
            _svc.GetInvoiceList();
        }
        catch (Exception exception)
        {
            _logEntryError.Message = "Error by invoking the WebMethods Method : " + exception.Message + Environment.NewLine + exception.InnerException + Environment.NewLine + exception.StackTrace;

            Logger.Write(_logEntryError);
        }

    }
    public static DateTime GetNextExecutionTime(TimeSpan time, DayOfWeek targetDayOfWeek)
    {
        var date = new DateTime(
            DateTime.Now.Year,
            DateTime.Now.Month,
            DateTime.Now.Day,
            time.Hours,
            time.Minutes,
            time.Seconds).AddDays(GetDaysToNextWeekDay(DateTime.Now,  targetDayOfWeek));

        return date;
    }

    /// <summary>
    /// Gets the days to next week day.
    /// </summary>
    /// <param name="startDate">The start date.</param>
    /// <param name="targetDayOfWeek">The target day of week.</param>
    /// <returns></returns>
    /// <remarks></remarks>
    public static int GetDaysToNextWeekDay(DateTime startDate, DayOfWeek      targetDayOfWeek)
    {
        int start = (int)startDate.DayOfWeek;
        int target = (int)targetDayOfWeek;

        if (target <= start)
            target += 7;

        return target - start;
    } 
4

0 に答える 0