Windows Azure ワーカー ロールの run メソッドが 1 回ではなく 2 回呼び出されるのはなぜですか? worker ロールの run メソッドが呼び出される頻度を遅くする方法はありますか?
Small VM を使用して 1 つの Web ロールを実行し、Extra Small VM を使用して 1 つの worker ロールを実行しています。
15 分ごとに実行するタスクがあります。1 秒間に 1 回ではなく、2 回実行されているように見えます。これが私のログです:
Orders を使用して xyz@google.com の 10/30/2013 5:40:17 PM に
自動同期が呼び出されました
場合によっては、タスクが 10 秒または 15 秒で実行されることがあります。
Orders を使用して xyz@google.com の 10/31 9:22:33 AM に
自動同期が呼び出されました
私はそれを言いたい:
Orders を使用して xyz@google.com の 10/30/2013 5:40:17 PM に
自動同期が呼び出されました
タスクが 2 回呼び出された結果、注文管理システムで注文が重複します。
これが私のコードです:
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));
}
}
これは良い考えですか?