Hangfire Backgroundjob通过取消rilazization对象问题排队



通常情况下,我可以毫无问题地将hangfire作业排入队列。我正在尝试将从数据库中动态获取对象/参数的作业排入队列。我正在通过取消初始化生成参数,调用数据生成不正确(作为对象(。(我正在使用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);
}
}

项目组件名称:

MyAssembly.BackgroundJobs.MyClass,MyAssembly,版本=1.0.0.0,区域性=中性,PublicKeyToken=空

混凝土等级:

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)));
}
}   

我的调用数据:

{quot;类型":quot;Volo.Abp.BackgroundJobs.Hangfire.HangfireJobExecutionAdapter`1[[System.Object,System.Private.CoreLib,版本=6.0.0.0,区域性=中性,PublicKeyToken=7cec85d7bea7798e]],Volo.Abp.BackgroundJobs.HangFire,版本=5.3.3.0,文化=中性,PublicKeyToken=null"方法":"ExecuteAsync"ParameterTypes":"[quot;System.Object,System.Private.CoreLib,版本=6.0.0.0,区域性=中性,PublicKeyToken=7cec85d7bea7798e"]&"论点":"["{\"CurrentDate\":\"2022-09-15T00:00+03:00\",\"DateInterval\":-5,\"ProjectId\":11}"]"}

应为的调用数据

{类型:Volo.Abp.BackgroundJobs.Hangfire.HangfireJobExecutionAdapter`1[[MyAssembly.BackgroundJobs.MyClass,MyAssembly,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]],Volo.Abp.BackgroundJobs.HangFire,版本=5.3.3.0,文化=中性,PublicKeyToken=null"方法":"ExecuteAsync"ParameterTypes":"[quot;MyAssembly.BackgroundJobs.MyClass,MyAssembly,版本=1.0.0.0,区域性=中性,PublicKeyToken=null"]&"论点":"["{\"CurrentDate\":\"2022-09-15T00:00+03:00\",\"DateInterval\":-5,\"ProjectId\":11}"]"}

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

我使用这些方法解决了它

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);
}

最新更新