网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using Dpz.Core.EnumLibrary;
using Dpz.Core.Public.ViewModel;
using Dpz.Core.Service.ObjectStorage.Services;
using Dpz.Core.Service.RepositoryService;
using Hangfire;

namespace Dpz.Core.Web.Jobs.Hangfire;

public class TaskListHandleActivator : JobActivator
{
    private readonly IObjectStorageOperation _objectStorageService;
    private readonly IWaitExecutionService _waitExecutionService;
    private readonly ILogger<TaskListHandleActivator> _logger;
    private readonly string _host;

    public TaskListHandleActivator(
        IObjectStorageOperation objectStorageService,
        IWaitExecutionService waitExecutionService,
        IConfiguration configuration,
        ILogger<TaskListHandleActivator> logger)
    {
        _objectStorageService = objectStorageService;
        _waitExecutionService = waitExecutionService;
        _logger = logger;

        _host = configuration.GetSection("upyun")["Host"] ?? throw new Exception("upyun Host is null");
    }

    [ProlongExpirationTime]
    public async Task HandleAsync()
    {
        var taskList = await _waitExecutionService.GetNotExecuteTaskAsync();
        // foreach (var item in taskList.Where(x => x.Category == ExecuteCategory.Delete))
        // {
        //     await DeleteAsync(item);
        // }

        await Parallel.ForEachAsync(taskList, async (item, _) =>
        {
            if (item.Category == ExecuteCategory.Delete)
            {
                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. 类的构造函数

  • 依赖注入: 构造函数接受多个参数,包括 IObjectStorageOperationIWaitExecutionServiceIConfigurationILogger<TaskListHandleActivator>。这些参数通过依赖注入提供,允许类在运行时使用这些服务。
  • 配置读取: 从配置中读取 upyunHost 值,如果未找到则抛出异常。

2. 处理任务的异步方法 HandleAsync

  • 获取待执行任务: 使用 _waitExecutionService.GetNotExecuteTaskAsync() 方法获取所有未执行的任务列表。
  • 并行处理任务: 使用 Parallel.ForEachAsync 方法并行处理任务列表中的每个任务。对于每个任务,如果其类别为 ExecuteCategory.Delete,则调用 DeleteAsync 方法进行删除操作。

3. 删除任务的私有方法 DeleteAsync

  • 处理删除逻辑: 根据任务的 Scheme 属性决定如何处理任务。
    • DeleteUpyun: 如果任务的 SchemeDeleteUpyun,则检查 Relation 属性是否以 _host 开头。如果是,则提取出相对路径并调用 _objectStorageService.DeleteAsync(relation) 方法进行删除。
      • 异常处理: 如果在删除过程中发生异常,记录错误并更新任务状态为 ExecuteFail
      • 更新状态: 无论删除是否成功,最后都会将任务状态更新为 ExecuteComplete
    • None 或其他情况: 如果 SchemeNone 或其他未定义的情况,记录相关信息。

4. 注释的代码

  • 代码中有一些被注释掉的部分,例如清理过期任务的逻辑和直接处理删除任务的循环。这些部分可能是为了调试或未来的功能扩展而保留的。

总结

整体来看,TaskListHandleActivator 类的主要功能是从待执行任务列表中获取任务,并根据任务的类别和方案执行相应的操作,特别是删除操作。它使用了异步编程和并行处理来提高性能,并通过日志记录和异常处理来确保操作的可靠性。

loading