3

为什么 Windows Azure 辅助角色中的 run 方法被调用了两次,而不是一次?有没有办法减慢调用工人角色运行方法的频率?

我正在使用小型 VM 运行 1 个 Web 角色,使用 Extra Small VM 运行 1 个辅助角色。

我有一个应该每 15 分钟运行一次的任务。它似乎运行两次,而不是在 1 秒内运行一次。这是我的日志:

使用订单的 xyz@google.com 已于 2013 年 10 月 30 日下午 5:40:17
调用自动同步使用订单的 xyz@google.com 已于 2013 年 10 月 30 日下午 5:40:16 调用自动同步

有时,任务会在 10 或 15 秒内运行:

使用订单的 xyz@google.com 已于 2013 年 10 月 31 日上午 9:22:33
调用自动同步 使用订单的 xyz@google.com 已于 2013 年 10 月 31 日上午 9:22:25 调用自动同步

我想这样说:

使用订单的 xyz@google.com 已于 2013 年 10 月 30 日下午 5:40:17
调用自动同步使用订单的 xyz@google.com 已于 2013 年 10 月 30 日下午 5:55:16 调用自动同步

由于任务被调用两次,订单在订单管理系统中重复。

这是我的代码:

    public List<MyTask> GetAllTasks()
    {
        List<MyTask> jtList = new List<MyTask>();
        using (SqlConnection con = new SqlConnection(_connectionString))
        {
            con.Open();
            using (SqlCommand command = new SqlCommand("select * from my_task where Seconds < DATEDIFF(SECOND, LastStartUtc, GETDATE()) AND Enabled = @Enabled", con))
            {
                command.Parameters.Add(new SqlParameter("Enabled", "1"));
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    MyTask jt = m_Mapper.Map(reader);
                    jtList.Add(jt);
                }
            }
            con.Close();
        }

        return jtList;
    }



    public class WorkerRole : RoleEntryPoint
    {
    string conString = "xyz"
    IMyTaskProvider m_TaskProvider;

    public override void Run()
    {
        // This is a sample worker implementation. Replace with your logic.
        while (true)
        {
            ExecuteTasks();
            Thread.Sleep(600000);
            Trace.TraceInformation("Working", "Information");
        }
    }

    public override bool OnStart()
    {
        ServicePointManager.DefaultConnectionLimit = 12;
        m_TaskProvider = JMATaskFactory.Get(conString);
        return base.OnStart();
    }


    void PerformTask(MyTask task)
    {
        //mark task as synced for now. The last start date is updated to now.
        m_TaskProvider.UpdateMyTask(task.Email);

        //Update some data
    }


    public string ExecuteTasks()
    {
        try
        {
            List<MyTask> tasks = m_TaskProvider.GetAllTasks();


            foreach (MyTask task in tasks)
            {
                PerformTask(task);
            }


            return "OK";
        }
        catch (Exception ex)
        {
            //LOG ERROR

        }
    }
}

我正在考虑添加代码以再次提取任务详细信息,检查它是否已经同步:

        void PerformTask(MyTask task)
    {
        //check and see if the task has been run already. This should prevent the double syncing issue
        task = m_TaskProvider.GetMyTask(task.ID);
        if (DateTime.Now.AddSeconds(task.Seconds * -1) - task.LastStartUtc  > new TimeSpan(0, 0, 0, int.Parse(task.Seconds.ToString())))
        {
            m_TaskProvider.UpdateMyTask(task.Email);
            ISqlSettingProvider settingProvider = SettingFactory.Get(conString, task.Email, task.ECommerceSystem, task.StoreUrl);
            JMAQBCommon jmaQBCommon = new JMAQBCommon(task.Email, settingProvider.GetSettings(), settingProvider, CloudCartConnectorLogProvider.Instance);
            jmaQBCommon.AutoSyncWithSystem(task.Email, task.StoreUserName, task.StorePassword, task.StoreUrl, task.ECommerceSystem, task.Name, null, ObjectConverter.IntegerConverter(task.Seconds));
        }
    }

这是一个好主意吗?

4

0 回答 0