IHostedService nie odpala się na serwerze

0

Siemanko, mam takie pytanie - w aplikacji zaimplementowałem joba który codziennie w nocy pobiera z API jakieś dane.
Użyłem do tego IHostedService, a kod jest banalny:

public class JobService : IHostedService
{
    private Timer _timer;

    public Task StartAsync(CancellationToken cancellationToken)
    {            
        // coś tam
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _timer?.Change(Timeout.Infinite, 0);

        return Task.CompletedTask;
    }
}

Serwis został dodany w klasie Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    // coś tam
    services.AddHostedService<JobService>();
}

No i teraz o ile odpalę aplikację lokalnie, ten kod się działa bez problemu, ale po opublikowaniu aplikacji na serwer job sie nie wykonuje, Ktoś może się orientuje co tu jest grane?

0

Tajmer ryly?
Tu masz przykład jak pożenić IHostedService z cyklicznym uruchamianiem:

public sealed class PostManService : BackgroundService
{
    private readonly IServiceProvider serviceProvider;
    private readonly ILogger<PostManService> logger;
    private readonly static SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
    private readonly Config config;


    public PostManService(IServiceProvider services, ILogger<PostManService> logger, IOptions<Config> config)
    {
        this.serviceProvider = services;
        this.logger = logger;
        this.config = config.Value;
    }


    protected override async Task ExecuteAsync(CancellationToken cancellationToken)
    {
        while (!cancellationToken.IsCancellationRequested)
        {
            await DispatchMessages(cancellationToken);
            await Task.Delay(config.DelayTimeBetweenDispatches, cancellationToken);
        }
    }

    public async Task DispatchMessages(CancellationToken cancellationToken)
    {
        await semaphore.WaitAsync();
        try
        {
            using (var scope = serviceProvider.CreateScope())
            {
                var eventSenders = scope.ServiceProvider.GetServices<IEventSender>();
                foreach (var eventSender in eventSenders)
                {
                    try
                    {
                        await eventSender.SendEvents(cancellationToken);
                    }
                    catch (Exception ex)
                    {
                        logger.LogError(ex, "PostManService failed to send events.");
                    }
                }
            }
        }
        finally
        {
            semaphore.Release();
        }
    }



    public class Config
    {
        public int DelayTimeBetweenDispatches { get; set; }



        public Config()
        {
            DelayTimeBetweenDispatches = 1000;
        }
    }
}

źródło PostManService.cs

3

Jeżeli startujesz aplikację przez IIS z domyślnymi ustawieniami to twoja aplikacja może być wyłączona przez mechanizm 'app pool recycles'.

1 użytkowników online, w tym zalogowanych: 0, gości: 1