4

5 時間ごとに自動化されたジョブを実行する必要があります。

IScheduledTaskHandler と IScheduledTaskManager を使用して、スケジュールされたタスクを作成する方法に関するこの投稿を見つけました。 Orchard CMS を使用してスケジュールされたタスク

同じコードをコピーし、Process 関数内にサービス コールを追加しました。それはうまくコンパイルされます。しかし、Windows サービスの開始のように、このスケジュールされたタスクを「開始」する必要があるかどうかはわかりません。ソリューションをビルドした後、自動的に取得されますか? このジョブを 5 時間で実行したい場合、時計はいつ動き始めますか? また、停止/一時停止したい場合は、どうすればよいですか?

ありがとう。

編集:

タスク ハンドラーでカスタム モジュールを有効にしようとすると、例外が発生します。

例外の詳細: System.ArgumentNullException: 値を null にすることはできません。パラメータ名: ソース

Line 241: var shellContext = _shellContexts.FirstOrDefault(c => c.Settings.Name == settings.Name);

ソース ファイル: \orchard-1.4\src\Orchard\Environment\DefaultOrchardHost.cs 行: 241

_shellContexts が null として表示されます。プロジェクト/モジュールからタスク ハンドラー クラスを削除すると、すべて正常に動作します。

タスク ハンドラのコードは次のとおりです。

public class ScheduledTaskHandler : IScheduledTaskHandler
{
    private const string TaskType = "MyTaskUniqueID";
    private readonly IScheduledTaskManager _taskManager;
    private readonly IMyService _myService;

    public ILogger Logger { get; set; }

    public ScheduledTaskHandler(IScheduledTaskManager taskManager, IMyService myService)
    {
        _myService = myService;
        _taskManager = taskManager;
        Logger = NullLogger.Instance;
        try
        {
            DateTime firstDate = new DateTime().AddMinutes(5);
            ScheduleNextTask(firstDate);
        }
        catch (Exception e)
        {
            this.Logger.Error(e, e.Message);
        }
    }

    public void Process(ScheduledTaskContext context)
    {
        if (context.Task.TaskType == TaskType)
        {
            try
            {
                _myService.RunJob();
            }
            catch (Exception e)
            {
                this.Logger.Error(e, e.Message);
            }
            finally
            {
                DateTime nextTaskDate = new DateTime().AddHours(5);
                ScheduleNextTask(nextTaskDate);
            }
        }
    }

    private void ScheduleNextTask(DateTime date)
    {
        if (date > DateTime.UtcNow)
        {
            var tasks = this._taskManager.GetTasks(TaskType);
            if (tasks == null || tasks.Count() == 0)
                this._taskManager.CreateTask(TaskType, date, null);
        }
    }


}
4

3 に答える 3

5

アプリを起動すると、時計が自動的に刻み始めます。停止/一時停止することはできません。

スケジューラは 1 分間隔で実行されます。今すぐ実行する必要があるタスクがあるかどうかを確認して実行します。タスクはデータベースに保存されています - 対応するレコードは、タスクの実行が開始される直前に常に削除されます (特定のタスクが 1 回だけ実行されるようにするため)。

繰り返しジョブを実行する必要がある場合は、前のタスクが完了した直後に新しいタスクを作成する必要があります (リンク先の例のように)。

于 2012-07-13T18:18:46.347 に答える
1

誰かが興味を持っている場合は、ScheduledTaskHandler からスターター コードを削除しただけです。以下は、いくつかのコントローラーコンストラクターに付けたものです

private void ScheduleStartTask() {
    var tasks = _scheduledTaskManager.GetTasks(TaskType);
    if (tasks == null || tasks.Count() == 0) {

        var date = _clock.UtcNow.AddSeconds(5);

        _scheduledTaskManager.CreateTask(TaskType, date, null);
    }
}

そしてハンドラーで

public void Process(ScheduledTaskContext context) {
        if (context.Task.TaskType == TaskType) {
            try {

                var x = "kuku";

            } catch (Exception e) {
                this.Logger.Error(e, e.Message);
            } finally {

                this.ScheduleNextTask();
            }
        }
    }

    private void ScheduleNextTask() {
        var date = _clock.UtcNow.AddSeconds(5);
        _taskManager.DeleteTasks(null, a => a.TaskType == TaskType);
        _taskManager.CreateTask(TaskType, date, null);
    }
于 2013-01-02T11:04:10.910 に答える
0

ILogger の代わりに ILoggerFactory を使用し、そこから Logger インスタンスを取得します。

public ScheduledTaskHandler(IScheduledTaskManager taskManager,ILoggerFactory LoggerFactory, IMyService myService)
    {
        _myService = myService;
        _taskManager = taskManager;
        Logger = NLoggerFactory.CreateLogger(typeof(ScheduledTaskHandler));;
        try
        {
            DateTime firstDate = new DateTime().AddMinutes(5);
            ScheduleNextTask(firstDate);
        }
        catch (Exception e)
        {
            this.Logger.Error(e, e.Message);
        }
    }
于 2012-07-17T14:25:52.070 に答える