public async Task <StreamHandshakeToken> DeliverItem(object item, StreamSequenceToken currentToken, StreamHandshakeToken handshakeToken) { if (expectedToken != null) { if (!expectedToken.Equals(handshakeToken)) { return(expectedToken); } } await NextItem(item, currentToken); // check again, in case the expectedToken was changed indiretly via ResumeAsync() if (expectedToken != null) { if (!expectedToken.Equals(handshakeToken)) { return(expectedToken); } } expectedToken = StreamHandshakeToken.CreateDeliveyToken(currentToken); return(null); }
public async Task <StreamHandshakeToken> DeliverBatch(IBatchContainer batch, StreamHandshakeToken handshakeToken) { // we validate expectedToken only for ordered (rewindable) streams if (expectedToken != null) { if (!expectedToken.Equals(handshakeToken)) { return(expectedToken); } } if (batch is IBatchContainerBatch) { var batchContainerBatch = batch as IBatchContainerBatch; await NextBatch(batchContainerBatch); } else { foreach (var itemTuple in batch.GetEvents <T>()) { await NextItem(itemTuple.Item1, itemTuple.Item2); } } if (IsRewindable) { expectedToken = StreamHandshakeToken.CreateDeliveyToken(batch.SequenceToken); } return(null); }
private async Task DeliverBatchToConsumer(StreamConsumerData consumerData, IBatchContainer batch) { StreamHandshakeToken prevToken = consumerData.LastToken; Task<StreamHandshakeToken> batchDeliveryTask; bool isRequestContextSet = batch.ImportRequestContext(); try { batchDeliveryTask = consumerData.StreamConsumer.DeliverBatch(consumerData.SubscriptionId, batch.AsImmutable(), prevToken); } finally { if (isRequestContextSet) { // clear RequestContext before await! RequestContext.Clear(); } } StreamHandshakeToken newToken = await batchDeliveryTask; if (newToken != null) { consumerData.LastToken = newToken; consumerData.Cursor = queueCache.GetCacheCursor(consumerData.StreamId.Guid, consumerData.StreamId.Namespace, newToken.Token); } else { consumerData.LastToken = StreamHandshakeToken.CreateDeliveyToken(batch.SequenceToken); // this is the currently delivered token } }
private async Task <StreamHandshakeToken> DeliverBatchToConsumer(StreamConsumerData consumerData, IBatchContainer batch) { try { StreamHandshakeToken newToken = await ContextualizedDeliverBatchToConsumer(consumerData, batch); consumerData.LastToken = StreamHandshakeToken.CreateDeliveyToken(batch.SequenceToken); // this is the currently delivered token return(newToken); } catch (Exception ex) { this.logger.LogWarning(ex, "Failed to deliver message to consumer on {SubscriptionId} for stream {StreamId}, may retry.", consumerData.SubscriptionId, consumerData.StreamId); throw; } }
public async Task <StreamHandshakeToken> DeliverBatch(IBatchContainer batch, StreamHandshakeToken handshakeToken) { if (expectedToken != null) { if (!expectedToken.Equals(handshakeToken)) { return(expectedToken); } } foreach (var itemTuple in batch.GetEvents <T>()) { await NextItem(itemTuple.Item1, itemTuple.Item2); } expectedToken = StreamHandshakeToken.CreateDeliveyToken(batch.SequenceToken); return(null); }
public async Task <StreamHandshakeToken> DeliverItem(object item, StreamSequenceToken currentToken, StreamHandshakeToken handshakeToken) { if (this.expectedToken != null) { if (!this.expectedToken.Equals(handshakeToken)) { return(this.expectedToken); } } T typedItem; try { typedItem = (T)item; } catch (InvalidCastException) { // We got an illegal item on the stream -- close it with a Cast exception throw new InvalidCastException("Received an item of type " + item.GetType().Name + ", expected " + typeof(T).FullName); } await((this.observer != null) ? NextItem(typedItem, currentToken) : NextItems(new[] { Tuple.Create(typedItem, currentToken) })); // check again, in case the expectedToken was changed indiretly via ResumeAsync() if (this.expectedToken != null) { if (!this.expectedToken.Equals(handshakeToken)) { return(this.expectedToken); } } if (IsRewindable) { this.expectedToken = StreamHandshakeToken.CreateDeliveyToken(currentToken); } return(null); }
private async Task<StreamHandshakeToken> DeliverBatchToConsumer(StreamConsumerData consumerData, IBatchContainer batch) { StreamHandshakeToken prevToken = consumerData.LastToken; Task<StreamHandshakeToken> batchDeliveryTask; bool isRequestContextSet = batch.ImportRequestContext(); try { batchDeliveryTask = consumerData.StreamConsumer.DeliverBatch(consumerData.SubscriptionId, batch.AsImmutable(), prevToken); } finally { if (isRequestContextSet) { // clear RequestContext before await! RequestContext.Clear(); } } StreamHandshakeToken newToken = await batchDeliveryTask; consumerData.LastToken = StreamHandshakeToken.CreateDeliveyToken(batch.SequenceToken); // this is the currently delivered token return newToken; }