0

我有四个任务(t1、t2、t3、t4)需要每 7 天在一个项目(一个 URL)上按顺序运行。我使用 gearman 来运行这些任务,并使用 cronjob 将项目发送到 gearman 队列。项目的每个任务都有一个 date_run 分配给它。如果 t1 的 date_run 距离现在不到 7 天,则该任务被发送到队列。如果 t2 的 date_run 小于 t1,则该任务被发送到队列中......等等。

我遇到的问题是,如果某个项目的 t1 已排队,但在 cronjob 再次启动之前还没有时间完成。由于 date_run 在任务完成之前不会更新,因此看起来该任务尚未排队,并且队列中的同一项目将重复 t1 。

我想到的解决方案是:

  • 为每个任务添加唯一标识符并检查它们是否已经排队
  • 只需检查队列是否为空,并且在队列为空之前不要再排队
  • 将 date_queued 添加到 item 表并使用它而不是 date_run on t1 来安排每 7 天的任务

我想我会先检查stackoverflow,如果有解决这个问题的“最佳方法”?我似乎无法理解它。:S

谢谢!

4

2 回答 2

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;
            }
        }
    }
}
于 2012-10-15T01:26:23.170 回答
1

只需在将任务添加到队列时添加唯一 ID。不管你添加多少次,gearman只会注册一次。

于 2012-10-15T04:20:10.250 回答