找到Azure WebJob,但未执行计时器功能

时间:2018-08-16 00:55:49

标签: c# azure asp.net-core azure-webjobs

我已经完成了30多次测试,能够成功完成一项工作(它只完成了Console.WriteLine("")(TextWriter)log.WriteLine("")),但是自从尝试添加真实内容代码,我无法使其再次正常工作。

我已经删除了我添加的所有自定义代码,并将其恢复为仅执行日志记录语句,但是Azure从未完成初始作业运行。

这是整个输出,无论我坐了多长时间:

  

[08/16/2018 00:43:38> 0708fc:SYS INFO]状态已更改为Initializing

     

[08/16/2018 00:43:40> 0708fc:SYS INFO]使用脚本主机-'WindowsScriptHost'运行脚本'BatchJobEngineWebJob.exe'

     

[08/16/2018 00:43:40> 0708fc:SYS INFO]状态已更改为“运行”

     

[08/16/2018 00:43:43> 0708fc:INFO]找到了以下功能:

     

[08/16/2018 00:43:43> 0708fc:INFO] BatchJobEngineWebJob.Functions.DivisionI

     

[08/16/2018 00:43:45> 0708fc:INFO]作业托管已启动

阅读日志,您可以看到它正在识别我的定时功能(称为* .Functions.DivisionI),仅此而已。它说工作主持人开始了,就是这样。

这是我配置所有内容的program.cs代码:

static void Main()
{
    var serviceCollection = new ServiceCollection();
    ConfigureServices(serviceCollection);

    var config = new JobHostConfiguration();
    //config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(5);
    //config.Queues.VisibilityTimeout = TimeSpan.FromMinutes(1);
    //config.Queues.BatchSize = 1;
    config.JobActivator = new BatchJobActivator(serviceCollection.BuildServiceProvider());
    config.UseTimers();

    if (config.IsDevelopment)
    {
        config.UseDevelopmentSettings();
    }

    var host = new JobHost(config);

    // The following code ensures that the WebJob will be running continuously
    host.RunAndBlock();
}

private static void ConfigureServices(IServiceCollection serviceCollection)
{
    // Optional: Setup your configuration:
    var configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddEnvironmentVariables()
        .Build();

    // add any interfaces that will be needed here
    serviceCollection.AddTransient<IBatchJobService, BatchJobService>();
    // ...stripped the rest of the interfaces

    // executes the job
    serviceCollection.AddTransient<ExecuteBatchJobs, ExecuteBatchJobs>();

    // One more thing - tell azure where your azure connection strings are
    var connStringDashboard = configuration["ConnectionStrings:AzureWebJobsDashboard"];
    var connStringStorage = configuration["ConnectionStrings:AzureWebJobsStorage"];

    Environment.SetEnvironmentVariable("AzureWebJobsDashboard", connStringDashboard);
    Environment.SetEnvironmentVariable("AzureWebJobsStorage", connStringStorage);
}

这是我的Functions.cs类,其中包含需要执行的功能:

public class Functions
{
    private readonly IBatchJobService _batchJobService;

    //public Functions(IBatchJobService batchJobService)
    //{
    //    _batchJobService = batchJobService;
    //}

    // This function will get triggered/executed when a new message is written 
    // on an Azure Queue called queue.
    //public static void ProcessQueueMessage([QueueTrigger("queue")] string message, TextWriter log)
    //{
    //    log.WriteLine(message);
    //}

    //[FunctionName("HourlyBatchJobs_DivisionI")]
    public async Task DivisionI([TimerTrigger("1 * * * * *", RunOnStartup = true)] TimerInfo timerInfo, TextWriter log)
    {
        await log.WriteLineAsync("bout time!");
        Console.WriteLine("starting");
        //log.WriteLine("executing HourleyBatchJobs_DivisionI");
        //await _batchJobService.Execute();
    }
}

我在这里的代码有什么问题可能会阻止其执行?

要注意的一件事:我已经在WebJobs列表中添加和删除了40多个工作,以使其正常工作。我发现Azure WebJobs有一个非常严重的错误。如果添加,运行和删除名为“ Test5”的作业。然后稍后再返回并添加具有相同名称的另一个作业,单击“运行”按钮将失败,表示该作业已在执行。我最终不得不将作业添加为Test5b才能运行。我想知道这是否有可能使所有这些连续的测试都失败了?

1 个答案:

答案 0 :(得分:0)

尽管已经计划了,但实际上尚不存在用于.Net Core webjobs的VS 2017工具。仍然可以编写基于Core的WebJob并将其手动部署到Web App。但是请注意,WebJob SDK(这是另一个主题)尚不支持.NET Core。您可以参考此issue

此外,您可以使用 .net core 2.0控制台应用程序来实现它。您可以参考以下步骤。

1。安装Microsoft.Azure.WebJobs.Extensions软件包。

2。在Program.cs文件中添加以下代码。

var config = new JobHostConfiguration();

if (config.IsDevelopment)
{
     config.UseDevelopmentSettings();
}
config.UseTimers();
config.DashboardConnectionString ="storage connectionstring";
config.StorageConnectionString = "storage connectionstring";
var host = new JobHost(config);
host.RunAndBlock();

3。将Functions.cs文件添加到项目中。

public class Functions
 {
      public static void CronJob([TimerTrigger("0 */5 * * * *")] TimerInfo timer)
        {
            Console.WriteLine("timer job fired!");
        }
  }

4.KUDU上的输出。 enter image description here