- ABP Framework version: v7.2.2
- UI Type: Blazor Server
- Database System: EF Core (SQL Server)
- Tiered (for MVC) or Auth Server Separated (for Angular): no
- Exception message and full stack trace:
- Steps to reproduce the issue:
I'm having a problem with jobs that are processed via hangfire module. When a job fails it can be requeued through the hangifre ui, but this interface is more backend than frontend user. I have a page in the application for front end user to see jobs in error state. I want them to be able to click a button and retry this job (not enqueue again, but reprocess failed job just like in backend ui). I've tried many things but in the end I always reach a point where I get stuck.
During job execution can I capture the job id somehow to set it in the error property of my transaction and then use this to retry the job when the user presses the button to retry?
7 Answer(s)
-
0
hi
You can check the source code of https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs#L12
I guess the
BackgroundJob
API can get thejob id
. -
0
Hi,
I had already tried something with
BackgroundJob
before I posted, I just couldn't get it to work and Is till don't understand how to apply this. In essence a class that processes a type of jobpublic class TransactionProcessingJob : AsyncBackgroundJob<TransactionProcessingArgs>, ITransientDependency
has method
public override async Task ExecuteAsync(TransactionProcessingArgs args) { try { IUnitOfWorkManager unitOfWorkManager = _serviceProvider.GetRequiredService<IUnitOfWorkManager>(); using (unitOfWorkManager.Begin()) { // stuff in here } } catch (Exception ex) { Logger.LogError(ex, "Unable to process transaction {TransactionId}", args.TranId); await _emailSender.QueueAsync( to: _config["Notifications:Recipients"], subject: $"Error processing transaction {args.TranId} {args.Channel} {args.ObjectType} {args.ExternalID} for Tenant: {tenantId}", body: $"{ex.Message}</br>{ex.InnerException?.Message}" ); using (_currentTenant.Change(tenantId != default ? tenantId : null)) { var transaction = await _transactionRepository.GetAsync(args.TranId); transaction.Error = $"{ex.Message}\n{ex?.InnerException?.Message}"; await _transactionRepository.UpdateAsync(transaction); } throw; } }
In the catch block, it'd be nice to capture job id and set it on a property of the transaction, this way from a dashboard page, using
TransactionAppService
The user can retry that transaction.
I had already tried to do this adapating an implementation in one of the modules that grabs a distributed lock and
IBackgroundJobStore
to use FindAsync(guid) to retrieve the job, but since I don't have the job id I can't useIBackgroundJobExecuter
to execute the job. -
0
hi
I think you can use Hangfire API and its job class directly instead of ABP's
AsyncBackgroundJob
-
0
You mean stop using
transactionProcessingJob : AsyncBackgroundJob<TArgs>
?? -
0
-
0
Thanks but I don't think that's an option for me, since all my projects are already using the abp provided implementation, and we don't want to re-implement something the framework is offering, it would be great of the abp implementation could add a property object with information of the particular task so that we can then use BackgroundJob to requeue it..
-
0
hi
You can replace the Hangfire services. If you have a problem, I can help
https://github.com/abpframework/abp/tree/dev/framework/src/Volo.Abp.BackgroundJobs.HangFire