【问题标题】:Hangfire Backgroundjob Enqueue via deserilaziation object problemHangfire Backgroundjob Enqueue 通过反序列化对象问题
【发布时间】:2022-10-13 03:00:10
【问题描述】:

通常我可以毫无问题地将hangfire作业排入队列。 我正在尝试将作业排入队列,动态地从数据库中获取对象/参数。 我正在通过反序列化生成参数,生成的 invoicationdata 不正确(作为对象)。 (我正在使用 ABP 框架,但我认为这个问题与 ABP 无关。)

工作队列:

public class JobExecuter
{
    private readonly IBackgroundJobInboxRepository backgroundJobInboxRepository;
    private readonly IJsonSerializer jsonSerializer;
    private readonly IBackgroundJobManager backgroundJobManager;
    public JobExecuter(
        IBackgroundJobInboxRepository backgroundJobInboxRepository,
        IJsonSerializer jsonSerializer,
        IBackgroundJobManager backgroundJobManager)
    {
        this.backgroundJobInboxRepository = backgroundJobInboxRepository;
        this.jsonSerializer = jsonSerializer;
        this.backgroundJobManager = backgroundJobManager;
    }
    public async Task ExecuteAsync()
        {
            var item = await backgroundJobInboxRepository.FirstOrDefault();
            var type = Type.GetType(item.AssemblyName);
            var obj = jsonSerializer.Deserialize(type, item.Arguments, false);
            await backgroundJobManager.EnqueueAsync(obj);
        }
}

item.AssemblyName:

MyAssembly.BackgroundJobs.MyClass,MyAssembly,版本=1.0.0.0, 文化=中立,PublicKeyToken=null

具体类:

public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDependency
{
    public virtual Task<string> EnqueueAsync<TArgs>(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal,
        TimeSpan? delay = null)
    {
        return Task.FromResult(BackgroundJob.Enqueue<HangfireJobExecutionAdapter<TArgs>>(adapter => adapter.ExecuteAsync(args)));
    }
}   

我的调用数据:

{“类型”:“Volo.Abp.BackgroundJobs.Hangfire.HangfireJobExecutionAdapter`1 [[系统对象, System.Private.CoreLib, 版本=6.0.0.0, 文化=中性, PublicKeyToken=7cec85d7bea7798e]], Volo.Abp.BackgroundJobs.HangFire, 版本=5.3.3.0,文化=中性, PublicKeyToken=null","Method":"ExecuteAsync","ParameterTypes":"["系统对象, System.Private.CoreLib, 版本=6.0.0.0, 文化=中性, PublicKeyToken=7cec85d7bea7798e"]","参数":"["{\"CurrentDate\":\"2022-09-15T00:00:00+03:00\",\"DateInterval\":-5,\"项目 ID\":11}"]"}

调用数据应该是:

{“类型”:“Volo.Abp.BackgroundJobs.Hangfire.HangfireJobExecutionAdapter`1 [[MyAssembly.BackgroundJobs.MyClass, 我的程序集, 版本=1.0.0.0, 文化=中性, PublicKeyToken=null]], Volo.Abp.BackgroundJobs.HangFire,版本=5.3.3.0,文化=中性, PublicKeyToken=null","Method":"ExecuteAsync","ParameterTypes":"["MyAssembly.BackgroundJobs.MyClass, 我的程序集,版本=1.0.0.0,文化=中性, PublicKeyToken=null"]","Arguments":"["{\"CurrentDate\":\"2022-09-15T00:00:00+03:00\",\"DateInterval\":-5,\"项目 ID\":11}"]"}

附加信息:您可以访问真正的HangfireBackgroundJobManager 课程。

【问题讨论】:

    标签: c# .net .net-core hangfire abp


    【解决方案1】:

    我使用这些methods 解决了它

    dynamic DynamicCast(object entity, Type to)
    {
       var openCast = this.GetType().GetMethod("Cast", BindingFlags.Static | BindingFlags.NonPublic);
       var closeCast = openCast.MakeGenericMethod(to);
       return closeCast.Invoke(this, new[] { entity });
    }
    static T Cast<T>(object entity) where T : class
    {
       return entity as T;
    }
    public async Task ExecuteAsync()
    {
       var item = await backgroundJobInboxRepository.FirstOrDefault();
       var type = Type.GetType(item.AssemblyName);
       var obj2 = jsonSerializer.Deserialize(type, item.Arguments, false);
       var obj = DynamicCast(obj2, type); // ADDED
       await backgroundJobManager.EnqueueAsync(obj);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 2013-02-10
      相关资源
      最近更新 更多