예제 #1
0
    /// <inheritdoc/>
    public override async Task <Contracts.SubscriptionResponse> Subscribe(Contracts.Subscription subscriptionRequest, ServerCallContext context)
    {
        var createExecutionContext = _executionContextCreator.TryCreateUsing(subscriptionRequest.CallContext.ExecutionContext);

        if (!createExecutionContext.Success)
        {
            return(new Contracts.SubscriptionResponse
            {
                Failure = new Dolittle.Protobuf.Contracts.Failure
                {
                    Id = FailureId.Other.ToProtobuf(),
                    Reason = $"Failed to create event horizon subscription because execution context was invalid: {createExecutionContext.Exception.Message}",
                }
            });
        }

        var executionContext = createExecutionContext.Result;

        var subscription = new SubscriptionId(
            executionContext.Tenant,
            subscriptionRequest.MicroserviceId.ToGuid(),
            subscriptionRequest.TenantId.ToGuid(),
            subscriptionRequest.ScopeId.ToGuid(),
            subscriptionRequest.StreamId.ToGuid(),
            subscriptionRequest.PartitionId);

        try
        {
            _metrics.IncrementTotalSubscriptionsInitiatedFromHead();
            _logger.IncomingSubscripton(subscription);

            var subscriptionResponse = await _getSubscriptionsFor(executionContext.Tenant).Subscribe(subscription, executionContext).ConfigureAwait(false);

            return(subscriptionResponse switch
            {
                { Success : false } => new Contracts.SubscriptionResponse {
                    Failure = subscriptionResponse.Failure
                },
                _ => new Contracts.SubscriptionResponse {
                    ConsentId = subscriptionResponse.ConsentId.ToProtobuf()
                },
            });
예제 #2
0
        /// <inheritdoc/>
        public override async Task <Contracts.SubscriptionResponse> Subscribe(Contracts.Subscription subscriptionRequest, ServerCallContext context)
        {
            _executionContextManager.CurrentFor(subscriptionRequest.CallContext.ExecutionContext);
            var consumerTenant = _executionContextManager.Current.Tenant;
            var subscriptionId = new SubscriptionId(
                consumerTenant,
                subscriptionRequest.MicroserviceId.To <Microservice>(),
                subscriptionRequest.TenantId.To <TenantId>(),
                subscriptionRequest.ScopeId.To <ScopeId>(),
                subscriptionRequest.StreamId.To <StreamId>(),
                subscriptionRequest.PartitionId.To <PartitionId>());

            try
            {
                _logger.Information("Incoming event horizon subscription request from head to runtime. {SubscriptionId}", subscriptionId);
                var subscriptionResponse = await _getConsumerClient().HandleSubscription(subscriptionId).ConfigureAwait(false);

                return(subscriptionResponse switch
                {
                    { Success : false } => new Contracts.SubscriptionResponse {
                        Failure = subscriptionResponse.Failure
                    },
                    _ => new Contracts.SubscriptionResponse(),
                });