private async Task OnNextAsync(GeneratedEvent evt, StreamSequenceToken sequenceToken) { // Ignore duplicates if (State.IsDuplicate(sequenceToken)) { logger.LogInformation("Received duplicate event. StreamGuid: {StreamGuid}, SequenceToken: {SequenceToken}", State.StreamGuid, sequenceToken); return; } logger.LogInformation("Received event. StreamGuid: {StreamGuid}, SequenceToken: {SequenceToken}", State.StreamGuid, sequenceToken); // We will only update the start token if this is the first event we're processed // In that case, we'll want to save the start token in case something goes wrong. if (State.TryUpdateStartToken(sequenceToken)) { await WriteStateAsync(); } // fault on 33rd event until fault is cleared if (State.Accumulator == 32 && !Faults.FaultCleared) { InjectFault(); } State.Accumulator++; State.LastProcessedToken = sequenceToken; if (evt.EventType != GeneratedEvent.GeneratedEventType.Report) { // every 10 events, checkpoint our grain state if (State.Accumulator % 10 != 0) { return; } logger.LogInformation( "Checkpointing: StreamGuid: {StreamGuid}, StreamNamespace: {StreamNamespace}, SequenceToken: {SequenceToken}, Accumulator: {Accumulator}", State.StreamGuid, State.StreamNamespace, sequenceToken, State.Accumulator); await WriteStateAsync(); return; } logger.LogInformation( "Final checkpointing: StreamGuid: {StreamGuid}, StreamNamespace: {StreamNamespace}, SequenceToken: {SequenceToken}, Accumulator: {Accumulator}.", State.StreamGuid, State.StreamNamespace, sequenceToken, State.Accumulator); await WriteStateAsync(); var reporter = GrainFactory.GetGrain <IGeneratedEventReporterGrain>(GeneratedStreamTestConstants.ReporterId); await reporter.ReportResult(this.GetPrimaryKey(), GeneratedStreamTestConstants.StreamProviderName, StreamNamespace, State.Accumulator); }
private GeneratedBatchContainer GenerateBatch() { sequenceId++; var evt = new GeneratedEvent { // If this is the last event generated, mark it as such, so test grains know to report results. EventType = (sequenceId != config.EventsInStream) ? GeneratedEvent.GeneratedEventType.Fill : GeneratedEvent.GeneratedEventType.End, }; return new GeneratedBatchContainer(streamGuid, config.StreamNamespace, evt, new EventSequenceToken(sequenceId)); }
private async Task OnNextAsync(GeneratedEvent evt, StreamSequenceToken sequenceToken) { // ignore duplicates if (State.IsDuplicate(sequenceToken)) { logger.Info("Received duplicate event. StreamGuid: {0}, SequenceToken: {1}", State.StreamGuid, sequenceToken); return; } logger.Info("Received event. StreamGuid: {0}, SequenceToken: {1}", State.StreamGuid, sequenceToken); // We will only update the start token if this is the first event we're processed // In that case, we'll want to save the start token in case something goes wrong. if (State.TryUpdateStartToken(sequenceToken)) { Faults.onFirstMessageFault.TryFire(InjectFault); await WriteStateAsync(); } State.Accumulator++; State.LastProcessedToken = sequenceToken; if (evt.EventType != GeneratedEvent.GeneratedEventType.Report) { Faults.onFirstMessageProcessedFault.TryFire(InjectFault); Faults.on33rdMessageFault.TryFire(InjectFault); // every 10 events, checkpoint our grain state if (State.Accumulator % 10 != 0) { return; } logger.Info("Checkpointing: StreamGuid: {0}, StreamNamespace: {1}, SequenceToken: {2}, Accumulator: {3}.", State.StreamGuid, State.StreamNamespace, sequenceToken, State.Accumulator); await WriteStateAsync(); return; } Faults.onLastMessageFault.TryFire(InjectFault); logger.Info("Final checkpointing: StreamGuid: {0}, StreamNamespace: {1}, SequenceToken: {2}, Accumulator: {3}.", State.StreamGuid, State.StreamNamespace, sequenceToken, State.Accumulator); await WriteStateAsync(); var reporter = GrainFactory.GetGrain <IGeneratedEventReporterGrain>(GeneratedStreamTestConstants.ReporterId); await reporter.ReportResult(this.GetPrimaryKey(), GeneratedStreamTestConstants.StreamProviderName, StreamNamespace, State.Accumulator); }