我有一个Azure Service Fabric应用程序,该应用程序具有实例化和监视CosmosDB Change提要的辅助角色。我试图使其每天结束时每天运行一次。
一切正常,除了让它只能在任何特定时间运行一次。
我目前正在将FeedPollDelay设置为1天,但是由于延迟是基于上一次扫描的完成而来的,因此它会缓慢爬网。这也没有解决开始时间。
我也使用了“开始时间”选项,但是无论我设置了什么时间,它都会立即开始处理。
std::string getWaveHeader(int data_size_bits, int channels, int sample_rate) {
char header[] =
"RIFF" // Chunk ID
"\x00\x00\x00\x00" // Chunk size (not set)
"WAVE" // WAVE ID
"fmt " // Chunk ID
"\x28\x00\x00\x00" // [little-endian] WAVE header size (40)
"\xfe\xff" // [little-endian] WAVE format code: WAVE_FORMAT_EXTENSIBLE
"\x00\x00" // number of channels (not set)
"\x00\x00\x00\x00" // sample rate (not set)
"\x00\x00\x00\x00" // average bytes/sec (not set)
"\x00\x00" // block size (not set)
"\x00\x00" // bits per sample (not set)
"\x16\x00" // [little-endian] size of extension (22)
"\x00\x00" // valid bits (not set)
"\x00\x00\x00\x00" // speaker position mask (not set)
"\x03\x00\x00\x00" // WAV_HEADER_SUB_FORMAT_CODE
"\x00\x00\x10\x00" // WAV_HEADER_SUB_GUID
"\x80\x00\x00\xaa" // WAV_HEADER_SUB_GUID
"\x00\x38\x9b\x71" // WAV_HEADER_SUB_GUID
"fact" // Chunk ID
"\x04\x00" // [little-endian] Chunk size (4)
"\x00\x00\x00\x00" // dwSample Length (not set)
"data" // Chunk ID
"\x00\x00\x00\x00"; // Wav header size (not set)
// modifications on |header| ....
// ...
// Set the following params in little-endian using given information.
// 1. Chunk size: |data_size_bits| + |header_size_bits| - 8
// 2. number of channels (given)
// 3. sample rate (given)
// 4. average bytes/sec: |sample rate| * |bit_per_sample|/8 * |channels|
// 5. block size: |bit_per_sample|/8 * |channels|
// 6. bits per sample (given)
// 7. valid bits: |bit_per_sample|
// 8. Wav header size: |data_size_bits|
std::string header_str = ConvertToString(header);
return header_str;
}
答案 0 :(得分:1)
StartTime
和StartFromBeginning
仅在根据official docs的租约集合为空的情况下有效。
假设您要在UTC晚上11点运行,可以通过一些在11 PM UTC调用StartAsync的工作线程或进程轻松实现这一点,而要停止它,只需调用StopAsync。
如果要在耗尽所有待处理的更改后立即停止它,则可以使用Estimator来衡量集合的当前状态与更改提要处理器之间的当前增量。您可以使用Estimator来每隔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();
}