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, ""));
        }
Exemple #2
0
        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);
        }