using Dpz.Core.EnumLibrary;
using Dpz.Core.Public.ViewModel;
using Dpz.Core.Service.ObjectStorage.Services;
using Dpz.Core.Service.RepositoryService;
using Dpz.Core.Web.Jobs.Configuration;
using Hangfire;
using JetBrains.Annotations;
using Microsoft.Extensions.Options;
namespace Dpz.Core.Web.Jobs.Hangfire;
[UsedImplicitly]
public class TaskListHandleActivator(
IObjectStorageOperation objectStorageService,
IWaitExecutionService waitExecutionService,
IConfiguration configuration,
ILogger<TaskListHandleActivator> logger,
IOptions<CrawlerOptions> crawlerOptions
) : JobActivator
{
private readonly string _host =
configuration.GetSection("upyun")["Host"] ?? throw new Exception("upyun Host is null");
private readonly CrawlerOptions _crawlerOptions = crawlerOptions.Value;
[ProlongExpirationTime]
public async Task HandleAsync()
{
var taskList = await waitExecutionService.GetNotExecuteTaskAsync();
// 限制并发度
var parallelOptions = new ParallelOptions
{
MaxDegreeOfParallelism = _crawlerOptions.MaxDegreeOfParallelism,
CancellationToken = CancellationToken.None,
};
await Parallel.ForEachAsync(
taskList,
parallelOptions,
async (item, cancellationToken) =>
{
if (item.Category == ExecuteCategory.Delete)
{
await Task.Delay(
TimeSpan.FromMilliseconds(_crawlerOptions.RequestDelayMs),
cancellationToken
);
await DeleteAsync(item);
}
}
);
await waitExecutionService.ClearExpiredAsync();
}
private async Task DeleteAsync(VmWaitExecution task)
{
switch (task.Scheme)
{
case ExecuteScheme.DeleteUpyun:
try
{
if (
!string.IsNullOrEmpty(task.Relation)
&& task.Relation.StartsWith(
_host,
StringComparison.CurrentCultureIgnoreCase
)
)
{
var relation = task.Relation[_host.Length..];
await objectStorageService.DeleteAsync(relation);
}
}
catch (Exception e)
{
logger.LogError(e, "delete fail");
await waitExecutionService.UpdateStatusAsync(
task.Id,
ExecuteStatus.ExecuteFail
);
}
await waitExecutionService.UpdateStatusAsync(
task.Id,
ExecuteStatus.ExecuteComplete
);
break;
case ExecuteScheme.None:
default:
logger.LogInformation("execute scheme:{ExecuteScheme}", task.Scheme.ToString());
break;
}
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
这段代码定义了一个名为 TaskListHandleActivator 的类,它是一个 Hangfire 任务处理器,主要用于处理待执行的任务列表。以下是代码的主要功能和结构的详细解释:
1. 类的构造函数
- 依赖注入: 构造函数接受多个参数,包括
IObjectStorageOperation、IWaitExecutionService、IConfiguration和ILogger<TaskListHandleActivator>。这些参数通过依赖注入提供,允许类在运行时使用这些服务。 - 配置读取: 从配置中读取
upyun的Host值,如果未找到则抛出异常。
2. 处理任务的异步方法 HandleAsync
- 获取待执行任务: 使用
_waitExecutionService.GetNotExecuteTaskAsync()方法获取所有未执行的任务列表。 - 并行处理任务: 使用
Parallel.ForEachAsync方法并行处理任务列表中的每个任务。对于每个任务,如果其类别为ExecuteCategory.Delete,则调用DeleteAsync方法进行删除操作。
3. 删除任务的私有方法 DeleteAsync
- 处理删除逻辑: 根据任务的
Scheme属性决定如何处理任务。- DeleteUpyun: 如果任务的
Scheme是DeleteUpyun,则检查Relation属性是否以_host开头。如果是,则提取出相对路径并调用_objectStorageService.DeleteAsync(relation)方法进行删除。- 异常处理: 如果在删除过程中发生异常,记录错误并更新任务状态为
ExecuteFail。 - 更新状态: 无论删除是否成功,最后都会将任务状态更新为
ExecuteComplete。
- 异常处理: 如果在删除过程中发生异常,记录错误并更新任务状态为
- None 或其他情况: 如果
Scheme是None或其他未定义的情况,记录相关信息。
- DeleteUpyun: 如果任务的
4. 注释的代码
- 代码中有一些被注释掉的部分,例如清理过期任务的逻辑和直接处理删除任务的循环。这些部分可能是为了调试或未来的功能扩展而保留的。
总结
整体来看,TaskListHandleActivator 类的主要功能是从待执行任务列表中获取任务,并根据任务的类别和方案执行相应的操作,特别是删除操作。它使用了异步编程和并行处理来提高性能,并通过日志记录和异常处理来确保操作的可靠性。
评论加载中...