Azure 每天在协调世界时11时处理Cosmosdb ChangeFeedProcesser一次

Azure 每天在协调世界时11时处理Cosmosdb ChangeFeedProcesser一次,azure,azure-cosmosdb,Azure,Azure Cosmosdb,我有一个Azure Service Fabric应用程序,它有一个工人角色,用于实例化和监视CosmosDB变更提要。我试着让它每天运行一次,在一天结束的时候 除了让它只运行一次,并且在任何特定的时间运行之外,一切都正常 我目前正在利用FeedPollDelay设置为1天,但这将缓慢爬行,因为延迟是基于最后一次扫描的完成。这也不涉及开始时间 我也使用了“开始时间”选项,但不管我设置了什么时间,它都会立即开始处理 DateTime dt = DateTime.Parse("2019

我有一个Azure Service Fabric应用程序,它有一个工人角色,用于实例化和监视CosmosDB变更提要。我试着让它每天运行一次,在一天结束的时候

除了让它只运行一次,并且在任何特定的时间运行之外,一切都正常

我目前正在利用FeedPollDelay设置为1天,但这将缓慢爬行,因为延迟是基于最后一次扫描的完成。这也不涉及开始时间

我也使用了“开始时间”选项,但不管我设置了什么时间,它都会立即开始处理

        DateTime dt = DateTime.Parse("2019-07-25 23:00");
        DateTime dtt = DateTime.SpecifyKind(dt, DateTimeKind.Utc);

        ChangeFeedProcessorOptions options = new ChangeFeedProcessorOptions()
        {
            StartFromBeginning = true,
            StartTime = dtt,
            FeedPollDelay = new TimeSpan(1, 0, 0, 0),
        };
根据,仅当租约集合为空时,StartTime和StartFromStart才起作用

假设您希望在UTC时间11点运行,您可以通过一些在UTC时间11点调用的工作线程或进程轻松实现这一点,当您想要停止它时,只需调用StopAsync

如果要在清空所有挂起的更改后停止它,可以使用测量集合的当前状态与更改提要处理器之间的当前增量。您可以使用估计器每X个时间量检查有多少待定更改,当它达到0时,只需在处理器上调用StopAsync

大致如下:

public async Task StartProcessorAsync()
{
    ChangeFeedProcessorBuilder builder = new ChangeFeedProcessorBuilder();
    //setup builder

    IChangeFeedProcessor processor = await builder.BuildAsync();
    await processor.StartAsync();

    await MeasureAndStopAsync(processor);
}


public async Task MeasureAndStopAsync(IChangeFeedProcessor processor)
{
    ChangeFeedProcessorBuilder builderForEstimator = new ChangeFeedProcessorBuilder();
    //setup builder just like for processor, same lease collection configuration

    IRemainingWorkEstimator estimator = await builderForEstimator.BuildEstimatorAsync();
    do
    {
        await Task.Delay(60000); // 1 minute
        long pendingChanges = await estimator.GetEstimatedRemainingWork();            
    }
    while(pendingChanges > 0);

    // Job's done
    await processor.StopAsync();
}

关于在预定时间启动处理器,它应该创建一个新的构建器/处理器并启动它,还是应该重新启动一个已经存在的处理器?