0

アイテム (URL) に対して 7 日ごとに順番に実行する必要がある 4 つのタスク (t1、t2、t3、t4) があります。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

ありがとう!

4

2 に答える 2

1

タスクをキューに追加するときに一意の ID を追加するだけです。何回追加しても、ギアマンは1つしか登録しません。

于 2012-10-15T04:20:10.250 に答える
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 に答える