我有一个Azure Service Fabric应用程序,该应用具有实例化和监视COSMOSDB更改feed的工人角色。我试图在一天结束时每天每天运行一次。
除了让它仅运行一次,并且在任何特定时间都可以运行。
我目前正在利用1天的FeedPolldelay设置,但这将慢慢爬网,因为延迟基于上次扫描的完成。这也无法解决开始时间。
我还玩过开始时间选项,但是无论我设置的时间如何,它都会立即开始处理。
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
和 StartFromBeginning
仅在您的租赁收集为空的情况下才能使用,根据官方文档。
假设您要在UTC下午11点运行,您可以通过一些工作线程或过程轻松地实现,这些工作线程或过程在11pm UTC呼叫StartAsync,并且当您想停止它时,只需致电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();
}