簡體   English   中英

如何為 Worker 服務安排任務

[英]How to schedule task for a Worker service

我正在實施 asp.net 核心 3.1 項目。 我正在使用一個 Worker 服務,它應該每天從 SQL 服務器表中讀取一些數據,並調用一個 api 應該發送一條短信,短信內容應該是從 ZAC5C74B64B4B8352EF2F11 服務器讀取的那些數據。 現在我可以調用短信 api 並通過它向用戶發送一些 static 數據。 問題是,雖然我定義了 api 應該每 5 秒調用一次,但它只發送 1 次短信以供使用。 如果有人告訴我如何解決這個問題,我將不勝感激。 下面是我嘗試過的:

public class Worker : BackgroundService, IHostedService, ISendingSMS
{
    private readonly ILogger<Worker> _logger;


    private MarketsContext _context;


    public IServiceScopeFactory _serviceScopeFactory;
    //---------------------------------------------------
    public Report report { get; set; }
    private MsgContent msgContent;
    //---------------------------------------------------
    public Worker(IServiceScopeFactory serviceScopeFactory)
    {
   
        _serviceScopeFactory = serviceScopeFactory;

    }

    //---------------------------------------------------------------------------------------
    public async Task GetReport()
    {

        IQueryable<Report> reportData = _context.Report.Select(x => new Report
        {
            ReportDate = x.ReportDate,
            TotalMarkets = x.TotalMarkets,
           
        })/*.FirstOrDefault()*/;

        report = await reportData.AsNoTracking().FirstOrDefaultAsync();
    }
    //-------------------------------------------------------------------------------
    public override async Task StartAsync(CancellationToken cancellationToken)
    {
        // DO YOUR STUFF HERE
        await base.StartAsync(cancellationToken);
    }

    public override async Task StopAsync(CancellationToken cancellationToken)
    {
        // DO YOUR STUFF HERE
        await base.StopAsync(cancellationToken);
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {

        using (var scope = _serviceScopeFactory.CreateScope())
        {
            var dbContext = scope.ServiceProvider.GetRequiredService<MarketsContext>();

            var _smssend = scope.ServiceProvider.GetRequiredService<SendingSMSService>();

            _context = dbContext;

            await GetReport();


            var message = new MsgContent
            {
                Username = "cse.etsg",
                Password = "wrwe",
                From = "4500000",
                To = "+429124203243",
                Message = report.ReportDate + "" + + report.TotalMarkets
            };


            _smssend.sendSMS(message);
           
            await Task.Delay(120000, stoppingToken);

            //Do your stuff
        }

        }
    }
}

發送短信服務

public class SendingSMSService /*: ISendingSMS*/
{

    public Report report { get; set; }


    // Here this method calls sms api sccessfully

    public async void sendSMS(MsgContent message)
    {

    

        using (var client = new HttpClient())
        {

            var myContent = JsonConvert.SerializeObject(message);
            var buffer = System.Text.Encoding.UTF8.GetBytes(myContent);
            var byteContent = new ByteArrayContent(buffer);
            byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            using (var result = client.PostAsync("https://api/SendSMS", byteContent).Result)
            {
                string Response = await result.Content.ReadAsStringAsync();

            }
        }

    }
}

報告

public partial class Report
{
    public int Id { get; set; }
    public string ReportDate { get; set; }
    public int? TotalMarkets { get; set; }

}

程序

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
         .UseWindowsService()
            .ConfigureServices((hostContext, services) =>
            {

                var configuration = hostContext.Configuration;

                services.AddHostedService<Worker>();
                //------------------------------------------------------------------------------
                services.AddScoped<SendingSMSService>();

                var connection = hostContext.Configuration.GetConnectionString("Markets");
                var optionsBuilder = new DbContextOptionsBuilder<MarketsContext>();
                optionsBuilder.UseSqlServer(connection);
                services.AddScoped<MarketsContext>(s => new MarketsContext(optionsBuilder.Options));
                

            });
}

在這種情況下,您可以使用Timed background task ,請參閱timed-background-tasks

在您的情況下,您將需要其中兩個。 它們根據您在StartAsync方法中的Timer參數進行調度,您不必顯式調用它們。

然后將創建的服務注入到 IHostBuilder.ConfigureServices (Program.cs) 中: services.AddHostedService<TimedHostedService>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM