- ABP Commercial version: v3.2.1
- UI type: Razor
- Tiered (MVC) or Identity Server Seperated (Angular): no
- Exception message and stack trace:
- Steps to reproduce the issue: Database : MongoDB
We have followed this document link https://docs.abp.io/en/abp/latest/Background-Jobs to crate a job and implemented exactly like this but somehow that job is not getting triggered and as soon as entry get added in Background Table IsAbandoned flag set to true. Sometimes we also observed this behaviour is that it suddendly start executing job and again stopped working. Cean -> rebuild- > build project is working some times. its a weird things we are obeserving. Here is the sample code,
public enum ImportTableName
{
Test1 = 1,
Test2 = 2
}
[BackgroundJobName("ImportJob")]
public class BackgroundImportJobArgs
{
public string FilePath { get; set; }
public ImportTableName ImportTableName { get; set; }
}
public class BackgroundImportJob : AsyncBackgroundJob<BackgroundImportJobArgs>, ITransientDependency
{
private readonly IImportTblAppService importTbl;
public BackgroundImportJob(IImportTblAppService importTbl)
{
this.importTbl = importTbl;
}
public override async Task ExecuteAsync(BackgroundImportJobArgs args)
{
switch (args.ImportTableName)
{
case ImportTableName.Test1:
await importTbl.AddTest1(args.FilePath, args.ImportTableName);
System.IO.File.Delete(args.FilePath);
break;
default:
break;
}
}
}
public class ImportTblAppService : DemoAppService, IImportTblAppService
{
private readonly ITest1Repository _test1Repository;
private readonly IBackgroundJobManager _backgroundJobManager;
public ImportTblAppService(ITest1Repository test1Repository, IBackgroundJobManager backgroundJobManager)
{
_test1Repository = test1Repository;
_backgroundJobManager = backgroundJobManager;
}
public async Task AddTest1(string filePath, ImportTableName tablename)
{
/* Here contains Insert Logic */
}
public async Task ScheduleImportJob(string filePath, ImportTableName tablename)
{
await _backgroundJobManager.EnqueueAsync(new BackgroundImportJobArgs { FilePath = filePath, ImportTableName = tablename }).ConfigureAwait(false);
}
}
12 Answer(s)
-
0
hi
Can you share some code to reproduce the problem?
-
0
Sample code Added.
-
0
@maliming Could you please revert urgently on above ? We are pressed for time for importing client data and this Background job working is very crucial .
-
0
hi @suraj.kumbhar
I'm checking.
-
0
hi
When IsAbandoned is true, it means that an exception has occurred.
Can you check the logs of your application?
-
0
Hi @maliming, Nothing gets logged, dont know why, The job that was working multiple times and suddenly it stopped without making any changes in code. Is job getting triggered at your end? if yes please provide us that working sample.
-
0
Hi,
You can check your application logs, log file is in the
logs
folder of your website root directory -
0
I know i checked, nothing gets logged and brekpoint also gets move to step after EnqueAsync();
-
0
hi @suraj.kumbhar
Can you share your project to me? include the necessary steps.
I will try to reproduce your problem.
My email: liming.ma@volosoft.com
Thanks.
-
0
hi
This is my test application service.
It works, but there will be a few exceptions. My local mongodb will not get an exception. I think it may be caused by your mongodb.
/* Inherit your application services from this class. */ public abstract class MyAppAppService : ApplicationService { protected MyAppAppService() { LocalizationResource = typeof(MyAppResource); } } public enum ImportTableName { Test1 = 1, Test2 = 2 } [BackgroundJobName("ImportJob")] public class BackgroundImportJobArgs { public string FilePath { get; set; } public ImportTableName ImportTableName { get; set; } } public interface IImportTblAppService : IApplicationService { Task AddTest1(string filePath, ImportTableName tablename); } public class BackgroundImportJob : AsyncBackgroundJob<BackgroundImportJobArgs>, ITransientDependency { private readonly IImportTblAppService importTbl; public BackgroundImportJob(IImportTblAppService importTbl) { this.importTbl = importTbl; } public override async Task ExecuteAsync(BackgroundImportJobArgs args) { Console.WriteLine("ExecuteAsync"); await importTbl.AddTest1(args.FilePath, args.ImportTableName); } } public class ImportTblAppService : MyAppAppService, IImportTblAppService { private readonly IBackgroundJobManager _backgroundJobManager; public ImportTblAppService(IBackgroundJobManager backgroundJobManager) { _backgroundJobManager = backgroundJobManager; } public Task AddTest1(string filePath, ImportTableName tablename) { Console.WriteLine("AddTest1"); return Task.CompletedTask; } public async Task ScheduleImportJob(string filePath, ImportTableName tablename) { await _backgroundJobManager.EnqueueAsync(new BackgroundImportJobArgs { FilePath = filePath, ImportTableName = tablename }); } }
[20:10:03 ERR] An exception occurred while receiving a message from the server. MongoDB.Driver.MongoConnectionException: An exception occurred while receiving a message from the server. ---> System.IO.IOException: Unable to read data from the transport connection: A connection attempt failed because the connected party did not properly respond after a period of tim e, or established connection failed because connected host has failed to respond.. ---> System.Net.Sockets.SocketException (10060): A connection attempt failed because the connected party did not properly respond after a period of time, or established connection f ailed because connected host has failed to respond. --- End of inner exception stack trace --- at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken) at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.GetResult(Int16 token) at System.Net.Security.SslStream.<FillBufferAsync>g__InternalFillBufferAsync|215_0[TReadAdapter](TReadAdapter adap, ValueTask`1 task, Int32 min, Int32 initial) at System.Net.Security.SslStream.ReadAsyncInternal[TReadAdapter](TReadAdapter adapter, Memory`1 buffer) at MongoDB.Driver.Core.Misc.StreamExtensionMethods.ReadAsync(Stream stream, Byte[] buffer, Int32 offset, Int32 count, TimeSpan timeout, CancellationToken cancellationToken) at MongoDB.Driver.Core.Misc.StreamExtensionMethods.ReadBytesAsync(Stream stream, Byte[] buffer, Int32 offset, Int32 count, TimeSpan timeout, CancellationToken cancellationToken) at MongoDB.Driver.Core.Connections.BinaryConnection.ReceiveBufferAsync(CancellationToken cancellationToken) --- End of inner exception stack trace --- at MongoDB.Driver.Core.Connections.BinaryConnection.ReceiveMessageAsync(Int32 responseTo, IMessageEncoderSelector encoderSelector, MessageEncoderSettings messageEncoderSettings, C ancellationToken cancellationToken) at MongoDB.Driver.Core.WireProtocol.CommandUsingQueryMessageWireProtocol`1.ExecuteAsync(IConnection connection, CancellationToken cancellationToken) at MongoDB.Driver.Core.Servers.Server.ServerChannel.ExecuteProtocolAsync[TResult](IWireProtocol`1 protocol, ICoreSession session, CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.RetryableWriteOperationExecutor.ExecuteAsync[TResult](IRetryableWriteOperation`1 operation, RetryableWriteContext context, CancellationToken canc ellationToken) at MongoDB.Driver.Core.Operations.BulkUnmixedWriteOperationBase`1.ExecuteBatchAsync(RetryableWriteContext context, Batch batch, CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.BulkUnmixedWriteOperationBase`1.ExecuteBatchesAsync(RetryableWriteContext context, CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation.ExecuteBatchAsync(RetryableWriteContext context, Batch batch, CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation.ExecuteAsync(IWriteBinding binding, CancellationToken cancellationToken) at MongoDB.Driver.OperationExecutor.ExecuteWriteOperationAsync[TResult](IWriteBinding binding, IWriteOperation`1 operation, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl`1.ExecuteWriteOperationAsync[TResult](IClientSessionHandle session, IWriteOperation`1 operation, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl`1.BulkWriteAsync(IClientSessionHandle session, IEnumerable`1 requests, BulkWriteOptions options, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSessionAsync[TResult](Func`2 funcAsync, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionBase`1.InsertOneAsync(TDocument document, InsertOneOptions options, Func`3 bulkWriteAsync) at Volo.Abp.Domain.Repositories.MongoDB.MongoDbRepository`2.InsertAsync(TEntity entity, Boolean autoSave, CancellationToken cancellationToken) at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo) at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync() at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed) at Volo.Abp.BackgroundJobs.BackgroundJobStore.InsertAsync(BackgroundJobInfo jobInfo) at Volo.Abp.BackgroundJobs.DefaultBackgroundJobManager.EnqueueAsync(String jobName, Object args, BackgroundJobPriority priority, Nullable`1 delay) at Volo.Abp.BackgroundJobs.DefaultBackgroundJobManager.EnqueueAsync[TArgs](TArgs args, BackgroundJobPriority priority, Nullable`1 delay) at MyApp.ImportTblAppService.ScheduleImportJob(String filePath, ImportTableName tablename) in C:\Users\maliming\Desktop\New folder (2)\src\MyApp.Application\MyAppAppService.cs:lin e 75 at lambda_method(Closure , Object ) at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, O bject[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope s cope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
-
0
I think this issue is only because of MongoDB, we are suing Azure CosmosDB with Mongo API Version 3.6 also. It has already issue present from last 2 months https://support.abp.io/QA/Questions/473/MongoDBDriverMongoCommandException-Command-aggregate-failed-Error2-After-deployment-on-Azure-using-CosmosDB.
Due to above issue we have choose to use 3.2 version for mongo in Cosmos and we started working. But when we want to implement Backgroung job its not working.
We have to use MongoDb only. Please suggest a workaround above issues. It has performance issue, Aggregation Issues, Background job is not getting triggered.
-
0
hi
Because you don't always get this exception, maybe you can use
try-catch
to retry.