public void Handle(ClientMessage.ReplayParkedMessages message) { PersistentSubscription subscription; var key = BuildSubscriptionGroupKey(message.EventStreamId, message.GroupName); Log.Debug("Replaying parked messages for persistent subscription {subscriptionKey} {to}", key, message.StopAt.HasValue ? $" (To: '{message.StopAt.ToString()}')" : " (All)"); if (message.StopAt.HasValue && message.StopAt.Value < 0) { message.Envelope.ReplyWith(new ClientMessage.ReplayMessagesReceived(message.CorrelationId, ClientMessage.ReplayMessagesReceived.ReplayMessagesReceivedResult.Fail, "Cannot stop replaying parked message at a negative version.")); return; } if (!_subscriptionsById.TryGetValue(key, out subscription)) { message.Envelope.ReplyWith(new ClientMessage.ReplayMessagesReceived(message.CorrelationId, ClientMessage.ReplayMessagesReceived.ReplayMessagesReceivedResult.DoesNotExist, "Unable to locate '" + key + "'")); return; } subscription.RetryParkedMessages(message.StopAt); message.Envelope.ReplyWith(new ClientMessage.ReplayMessagesReceived(message.CorrelationId, ClientMessage.ReplayMessagesReceived.ReplayMessagesReceivedResult.Success, "")); }
private void ReplayParkedMessages(HttpEntityManager http, UriTemplateMatch match) { if (_httpForwarder.ForwardRequest(http)) { return; } var envelope = new SendToHttpEnvelope( _networkSendQueue, http, (args, message) => http.ResponseCodec.To(message), (args, message) => { int code; var m = message as ClientMessage.ReplayMessagesReceived; if (m == null) { throw new Exception("unexpected message " + message); } switch (m.Result) { case ClientMessage.ReplayMessagesReceived.ReplayMessagesReceivedResult.Success: code = HttpStatusCode.OK; break; case ClientMessage.ReplayMessagesReceived.ReplayMessagesReceivedResult.DoesNotExist: code = HttpStatusCode.NotFound; break; case ClientMessage.ReplayMessagesReceived.ReplayMessagesReceivedResult.AccessDenied: code = HttpStatusCode.Unauthorized; break; default: code = HttpStatusCode.InternalServerError; break; } return(new ResponseConfiguration(code, http.ResponseCodec.ContentType, http.ResponseCodec.Encoding)); }); var groupname = match.BoundVariables["subscription"]; var stream = match.BoundVariables["stream"]; var stopAtStr = match.BoundVariables["stopAt"]; long?stopAt; // if stopAt is declared... if (stopAtStr != null) { // check it is valid if (!long.TryParse(stopAtStr, out var stopAtLong) || stopAtLong < 0) { http.ReplyStatus(HttpStatusCode.BadRequest, "stopAt should be a properly formed positive long", exception => { }); return; } stopAt = stopAtLong; } else { // else it's null stopAt = null; } var cmd = new ClientMessage.ReplayParkedMessages(Guid.NewGuid(), Guid.NewGuid(), envelope, stream, groupname, stopAt, http.User); Publish(cmd); }