在Gearman中排队项目的最佳方法

时间:2012-10-15 01:15:18

标签: php gearman

我有四个任务(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添加到项目表,并在t1上使用此而不是date_run来每7天安排一次任务

我认为我首先检查stackoverflow,如果有最好的方式"解决这个问题?我似乎无法理解它。 :S

谢谢!

2 个答案:

答案 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即可。无论你添加它多少次,齿轮工人只会注册一个。