我有四个任务(t1,t2,t3,t4)需要每7天按顺序在一个项目(URL)上运行。我使用gearman来运行这些任务,并使用cronjob将物品发送到gearman队列。项目的每个任务都分配了一个date_run。如果t1的date_run从现在开始少于7天,那么该任务将被发送到队列。如果t2的date_run小于t1,那么该任务将被发送到队列......依此类推。
我遇到的问题是,如果某个项目的t1已排队,但在cronjob再次启动之前没有时间完成。由于date_run在任务完成之前不会更新,因此看起来任务没有排队,并且我对队列中的同一项目有重复的t1。
我想到的解决方案是:
我认为我首先检查stackoverflow,如果有最好的方式"解决这个问题?我似乎无法理解它。 :S
谢谢!
答案 0 :(得分:1)
如何使用仅运行一次的任务? 我将使用一个带锁定的简单单例,而不是修改我的数据设置。
C#示例:
public class SingletonScheduledTask
{
public void Run()
{
SingletonScheduledTask._SingletonScheduledTask.Instance.Handle();
}
private sealed class _SingletonScheduledTask
{
//multithreaded singleton with on system load instantiation.
private static readonly _SingletonScheduledTask instance = new _SingletonScheduledTask();
private static object syncHandle = new Object();
private static bool handling = false;
private _SingletonScheduledTask() { }
public static _SingletonScheduledTask Instance
{
get
{
return instance;
}
}
public void Handle()
{
if (!handling)
{
bool _handling = false;
lock (syncHandle)
{
_handling = handling;
handling = true;
}
_DoHandle(!_handling);
}
}
private void _DoHandle(bool doHandle)
{
if (doHandle)
{
///code here
handling = false;
}
}
}
}
答案 1 :(得分:1)
将任务添加到队列时,只需添加唯一ID即可。无论你添加它多少次,齿轮工人只会注册一个。