開発現場ではQuartzを使った定時タスク処理が一般的です。毎日深夜に自動でデータを取得してレポートを作成する機能など、多くの開発者がcron式を直接コードに記述しています。しかし、新機能を開発する際には定時実行の時間になっていないため手動でタスクをトリガーするインターフェースを別途作成する必要があります。また、手動実行時のパラメータが自動タスクの条件と異なる場合もあります。これらの課題を解決するため、Quartzをベースにタスク管理と手動トリガー機能を提供し、UIインターフェースで管理できるコンポーネントを開発しました。
<PackageReference Include="Qin.TaskJobManage" Version="1.0.6.1" />
設定方法
public void ConfigureServices(IServiceCollection services)
{
services.AddTaskJob(options =>
{
// options.Route ホームページアドレス、デフォルトは /TaskJobUI
// options.LoadAssemblyName ジョブが含まれるアセンブリ名、デフォルトは現在のWeb起動アセンブリ
// options.SelfTurnOn アプリケーション起動時にタスクを実行、デフォルトはtrue
// options.AddJobExecutionLog<JobExecutionLog>(); 実行ログを追加
});
}
public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifetime)
{
lifetime.ApplicationStarted.Register(() => app.StartTaskJob());// アプリ起動後に定時タスクを自動実行
app.UseTaskJob(); // app.UseRouting(); の前に配置する必要あり
}
新しいジョブの作成
public class SampleJob : TaskModel, IJob
{
public override void Config()
{
status = 0;
taskName = "サンプルジョブ";
groupName = "テストグループ";
describe = "10秒ごとに実行";
cron = "0/10 * * * * ? ";
Job = typeof(SampleJob);
}
public override TriggerBuilder ConfigTrigger(TriggerBuilder triggerBuilder)
{
return triggerBuilder;
}
public Task Execute(IJobExecutionContext context)
{
JobDataMap dataMap = context.JobDetail.JobDataMap;
Console.WriteLine(dataMap.GetString("parameters") ?? "");
string jsonData = context.Trigger.JobDataMap.GetString("parameters") ?? "";
Console.WriteLine("動的パラメータ: " + jsonData);
return Task.Run(() =>
{
//int p = 0;
//var a = 12 / p;
ConsoleExcept.WriteLine("実行時間-" + DateTime.Now.ToString("HH:mm:ss"), ConsoleColor.Red);
});
//return Task.CompletedTask;
}
}
管理ページへのアクセス
http://localhost:xxx/TaskJobUI/
ジョブ実行ログのページングリスト
IJobExecutionLogsを実装
public class CustomJobExecutionLog : IJobExecutionLogs
{
public Task<ResultMsg> GetJobExecutionLog(TaskModel parameters, int pageIndex, int pageSize)
{
List<TaskModel> jobList = new List<TaskModel>();
jobList.Add(new TaskModel()
{
status = 0,
taskName = "サンプルジョブ",
groupName = "テストグループ",
describe = "10秒ごとに実行",
cron = "0/10 * * * * ? "
});
if (!string.IsNullOrWhiteSpace(parameters.taskName))
{
jobList = jobList.Where(a => a.taskName == parameters.taskName).ToList();
}
if (!string.IsNullOrWhiteSpace(parameters.groupName))
{
jobList = jobList.Where(a => a.groupName == parameters.groupName).ToList();
}
return Task.FromResult(new ResultMsg
{
msg = $"pageIndex={pageIndex},pageSize={pageSize},taskName={parameters.taskName},groupName={parameters.groupName}",
status = true,
data = new TableList<TaskModel>()
{
Count = jobList.Count(),
TableData = jobList.Skip(pageIndex == 1 ? 0 : (pageIndex - 1) * pageSize).Take(pageSize)
}
});
}
}
デモダウンロード
説明
- 実行中タスクのログ収集機能を使用するには、WorkingLogProvider を実装し、GetLogger() をオーバーライドする必要があります
- その他の機能は引き続き最適化中です。現時点ではデータベースへの永続化はサポートしていませんが、柔軟なインターフェースを実装して再利用可能です https://gitee.com/qintaie/Qin.TaskJobManage
更新情報
2023-10-24 バージョン2.0.0リリース
更新内容:
- UIインターフェースの最適化、時間フィルター機能とダークモードの追加、UIフレームワークをElementPlusに変更
- カプセル化されたジョブコードの最適化
- 定時タスクの手動実行時に開始時間と終了時間を取得する機能を追加(使用方法については「使用demo.zip」のWebApplication2を参照)
string run_stime = context.Trigger.JobDataMap.GetString("run_stime");
string run_etime = context.Trigger.JobDataMap.GetString("run_etime");