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