how a method isn’t found in a attempt and in the next attempt the same method is found?
Here my configuration
Startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
...
var settings = AppSettings.Global.Configure(services);
services.AddHangfire(config => {
var storage = new Hangfire.SqlServer.SqlServerStorageOptions { SchemaName = "HangFireWeb" };
config.UseSqlServerStorage(settings.ConnectionString.DefaultConnection, storage);
});
...
services.AddSingleton<ICecomService, CecomService>();
services.AddScoped<ITalaoService, TalaoService>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
using (var scope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<ICecomService>();
scope.ConfigureAuditoriaDbContext();
scope.ConfigureCoiDbContext();
}
app.UseHangfireServer();
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
Authorization = Enumerable.Empty<IDashboardAuthorizationFilter>()
});
...
}
}
My Services
ITalaoService.cs
public interface ITalaoService
{
Task VerificarTalao(Guid talaoId, Guid jobId);
Task NotificarCecom(Guid talaoId, Guid jobId);
Task NovoAceite(Guid talaoId, Guid equipeId, Guid jobId);
Task SuspenderTalao(Guid talaoId, Guid jobId);
Task CriarAceite(Guid talaoId, Guid equipeId, Guid? jobId);
Task EncerrarJobs(TalaoAcompanhamentoModel talao);
Task VerificarTaloesSuspensos(ViaturaModel viatura);
}
ICecomService.cs
public interface ICecomService
{
Task AtualizarViatura(ViaturaModel viatura);
Task AtualizarTalao(TalaoAcompanhamentoModel talao);
Task NotificarSugestao(Guid talaoId, Guid equipeId, Guid jobId);
Task NotificarSuspensao(Guid talaoId, Guid jobId);
Task NotificarAceiteCriado(Guid talaoId);
}
ITalaoService.cs
public class TalaoService : ITalaoService
{
private readonly CoiDbContext _context;
private readonly ICecomService _cecomService;
public TalaoService(CoiDbContext context, AuditoriaDbContext audit, ICecomService cecomService)
{
context.ConfigAudit(audit);
this._context = context;
this._cecomService = cecomService;
}
private async Task GetTalao(Guid talaoId, Guid? jobId, Func<Domain.Models.Talao, Task> callback)
{
var job = default(Domain.Models.TalaoParaAceiteJob);
if (jobId.HasValue)
{
job = await _context.TalaoParaAceiteJobs.FindAsync(jobId.Value);
if (job == null)
return;
}
var talao = await _context.Taloes.FirstOrDefaultAsync(x => x.TalaoId == talaoId && !x.EquipeId.HasValue);
if (talao == null)
return;
await callback(talao);
if (job != null)
{
_context.TalaoParaAceiteJobs.Remove(job);
}
await _context.SaveChangesAsync();
}
...
public async Task VerificarTalao(Guid talaoId, Guid jobId)
{
await this.GetTalao(talaoId, jobId, async (talao) =>
{
var emitTalao = talao != null && talao.DataCadastro.AddMinutes(1) <= DateTime.Now && talao.Status == Domain.Enums.StatusOcorrencia.Aberto;
if (emitTalao)
{
talao.Status = Domain.Enums.StatusOcorrencia.AbertoPendente;
await _cecomService.AtualizarTalao(await _context.Taloes.GetModel(talao.TalaoId));
}
});
}
...
}
Registering the jobs
var jobVerificar = new Domain.Models.TalaoParaAceiteJob();
jobVerificar.TalaoParaAceiteJobId = RT.Comb.Provider.Sql.Create();
jobVerificar.TalaoId = talaoId;
jobVerificar.JobId = Hangfire.BackgroundJob.Schedule<ITalaoService>(service => service.VerificarTalao(talaoId, jobVerificar.TalaoParaAceiteJobId), TimeSpan.FromMinutes(1));
var jobNotificar = new Domain.Models.TalaoParaAceiteJob();
jobNotificar.TalaoParaAceiteJobId = RT.Comb.Provider.Sql.Create();
jobNotificar.TalaoId = talaoId;
jobNotificar.JobId = Hangfire.BackgroundJob.Schedule<ITalaoService>(service => service.NotificarCecom(talaoId, jobNotificar.TalaoParaAceiteJobId), TimeSpan.FromSeconds(30));