예제 #1
0
        public ReceivedMessage GetMessage()
        {
            using (_databaseContextFactory.Create(_connectionName))
            {
                var row = _databaseGateway.GetSingleRowUsing(
                    RawQuery.Create(_scriptProvider.Get(Script.QueueDequeue, _tableName))
                    .AddParameterValue(QueueColumns.MachineName, _machineName)
                    .AddParameterValue(QueueColumns.QueueName, _tableName)
                    .AddParameterValue(QueueColumns.UnacknowledgedHash, _unacknowledgedHash)
                    .AddParameterValue(QueueColumns.UnacknowledgedId, Guid.NewGuid()));

                if (row == null)
                {
                    return(null);
                }

                var result = new MemoryStream((byte[])row["MessageBody"]);

                return(new ReceivedMessage(result, QueueColumns.SequenceId.MapFrom(row)));
            }
        }
 public IQuery RemoveSnapshot(Guid id)
 {
     return(new RawQuery(_scriptProvider.Get("EventStore.RemoveSnapshot")).AddParameterValue(EventStoreColumns.Id, id));
 }
예제 #3
0
        public SubscriptionManager(IServiceBusEvents events, IServiceBusConfiguration serviceBusConfiguration,
                                   ISubscriptionConfiguration configuration, IScriptProvider scriptProvider,
                                   IDatabaseContextFactory databaseContextFactory, IDatabaseGateway databaseGateway)
        {
            Guard.AgainstNull(events, "events");
            Guard.AgainstNull(serviceBusConfiguration, "serviceBusConfiguration");
            Guard.AgainstNull(configuration, "configuration");
            Guard.AgainstNull(scriptProvider, "scriptProvider");
            Guard.AgainstNull(databaseContextFactory, "databaseContextFactory");
            Guard.AgainstNull(databaseGateway, "databaseGateway");

            _log = Log.For(this);

            _serviceBusConfiguration = serviceBusConfiguration;
            _configuration           = configuration;
            _scriptProvider          = scriptProvider;
            _databaseContextFactory  = databaseContextFactory;
            _databaseGateway         = databaseGateway;

            events.Started += ServiceBus_Started;

            _subscriptionProviderName = configuration.ProviderName;

            if (string.IsNullOrEmpty(_subscriptionProviderName))
            {
                throw new ConfigurationErrorsException(string.Format(SubscriptionResources.ProviderNameEmpty,
                                                                     "SubscriptionManager"));
            }

            _subscriptionConnectionString = configuration.ConnectionString;

            if (string.IsNullOrEmpty(_subscriptionConnectionString))
            {
                throw new ConfigurationErrorsException(string.Format(SubscriptionResources.ConnectionStringEmpty,
                                                                     "SubscriptionManager"));
            }

            using (_databaseContextFactory.Create(_subscriptionProviderName, _subscriptionConnectionString))
            {
                if (_databaseGateway.GetScalarUsing <int>(
                        RawQuery.Create(
                            _scriptProvider.Get(
                                Script.SubscriptionManagerExists))) != 1)
                {
                    try
                    {
                        _databaseGateway.ExecuteUsing(RawQuery.Create(
                                                          _scriptProvider.Get(
                                                              Script.SubscriptionManagerCreate)));
                    }
                    catch (Exception ex)
                    {
                        if (
                            !ex.Message.Equals(
                                "There is already an object named 'SubscriberMessageType' in the database.",
                                StringComparison.OrdinalIgnoreCase))
                        {
                            throw new DataException(SubscriptionResources.SubscriptionManagerCreateException, ex);
                        }
                    }
                }
            }
        }
예제 #4
0
        public void Subscribe(IEnumerable <string> messageTypeFullNames)
        {
            Guard.AgainstNull(messageTypeFullNames, "messageTypeFullNames");

            if (_deferSubscribtions)
            {
                _deferredSubscriptions.AddRange(messageTypeFullNames);

                return;
            }

            if (_serviceBusConfiguration.IsWorker || _configuration.Subscribe == SubscribeOption.Ignore)
            {
                return;
            }

            if (!_serviceBusConfiguration.HasInbox
                ||
                _serviceBusConfiguration.Inbox.WorkQueue == null)
            {
                throw new InvalidOperationException(EsbResources.SubscribeWithNoInboxException);
            }

            var missingMessageTypes = new List <string>();

            using (_databaseContextFactory.Create(_subscriptionProviderName, _subscriptionConnectionString))
            {
                foreach (var messageType in messageTypeFullNames)
                {
                    if (_configuration.Subscribe == SubscribeOption.Normal)
                    {
                        _databaseGateway.ExecuteUsing(
                            RawQuery.Create(
                                _scriptProvider.Get(Script.SubscriptionManagerSubscribe))
                            .AddParameterValue(SubscriptionManagerColumns.InboxWorkQueueUri,
                                               _serviceBusConfiguration.Inbox.WorkQueue.Uri.ToString())
                            .AddParameterValue(SubscriptionManagerColumns.MessageType, messageType));
                    }
                    else
                    {
                        if (_databaseGateway.GetScalarUsing <int>(
                                RawQuery.Create(
                                    _scriptProvider.Get(Script.SubscriptionManagerContains))
                                .AddParameterValue(SubscriptionManagerColumns.InboxWorkQueueUri,
                                                   _serviceBusConfiguration.Inbox.WorkQueue.Uri.ToString())
                                .AddParameterValue(SubscriptionManagerColumns.MessageType, messageType)) == 0)
                        {
                            missingMessageTypes.Add(messageType);
                        }
                    }
                }
            }

            if (!missingMessageTypes.Any())
            {
                return;
            }

            foreach (var messageType in missingMessageTypes)
            {
                _log.Error(string.Format(SubscriptionResources.MissingSubscription, messageType));
            }

            throw new ApplicationException(string.Format(SubscriptionResources.MissingSubscriptionException, string.Join(",", missingMessageTypes)));
        }
 public IQuery SetSequenceNumber(string name, long sequenceNumber)
 {
     return(RawQuery.Create(_scriptProvider.Get("Projection.SetSequenceNumber"))
            .AddParameterValue(Columns.Name, name)
            .AddParameterValue(Columns.SequenceNumber, sequenceNumber));
 }
예제 #6
0
        public ProcessingStatus ProcessingStatus(TransportMessage transportMessage)
        {
            try
            {
                using (
                    var connection = _databaseContextFactory.Create(_idempotenceProviderName,
                                                                    _idempotenceConnectionString))
                    using (var transaction = connection.BeginTransaction())
                    {
                        try
                        {
                            if (_databaseGateway.GetScalarUsing <int>(
                                    RawQuery.Create(
                                        _scriptProvider.Get(
                                            Script.IdempotenceHasCompleted))
                                    .AddParameterValue(IdempotenceColumns.MessageId, transportMessage.MessageId)) == 1)
                            {
                                return(Esb.ProcessingStatus.Ignore);
                            }

                            if (_databaseGateway.GetScalarUsing <int>(
                                    RawQuery.Create(
                                        _scriptProvider.Get(
                                            Script.IdempotenceIsProcessing))
                                    .AddParameterValue(IdempotenceColumns.MessageId, transportMessage.MessageId)) == 1)
                            {
                                return(Esb.ProcessingStatus.Ignore);
                            }

                            _databaseGateway.ExecuteUsing(
                                RawQuery.Create(
                                    _scriptProvider.Get(
                                        Script.IdempotenceProcessing))
                                .AddParameterValue(IdempotenceColumns.MessageId, transportMessage.MessageId)
                                .AddParameterValue(IdempotenceColumns.InboxWorkQueueUri,
                                                   transportMessage.RecipientInboxWorkQueueUri)
                                .AddParameterValue(IdempotenceColumns.AssignedThreadId,
                                                   Thread.CurrentThread.ManagedThreadId));

                            var messageHandled = _databaseGateway.GetScalarUsing <int>(
                                RawQuery.Create(
                                    _scriptProvider.Get(
                                        Script.IdempotenceIsMessageHandled))
                                .AddParameterValue(IdempotenceColumns.MessageId, transportMessage.MessageId)) == 1;

                            return(messageHandled
                                                        ? Esb.ProcessingStatus.MessageHandled
                                                        : Esb.ProcessingStatus.Assigned);
                        }
                        finally
                        {
                            transaction.CommitTransaction();
                        }
                    }
            }
            catch (Exception ex)
            {
                var message = ex.Message.ToUpperInvariant();

                if (message.Contains("VIOLATION OF UNIQUE KEY CONSTRAINT") ||
                    message.Contains("CANNOT INSERT DUPLICATE KEY") || message.Contains("IGNORE MESSAGE PROCESSING"))
                {
                    return(Esb.ProcessingStatus.Ignore);
                }

                throw;
            }
        }
예제 #7
0
        public IdempotenceService(
            IServiceBusConfiguration serviceBusConfiguration,
            IIdempotenceConfiguration idempotenceConfiguration,
            IScriptProvider scriptProvider,
            IDatabaseContextFactory databaseContextFactory,
            IDatabaseGateway databaseGateway)
        {
            Guard.AgainstNull(serviceBusConfiguration, "serviceBusConfiguration");
            Guard.AgainstNull(idempotenceConfiguration, "idempotenceConfiguration");
            Guard.AgainstNull(scriptProvider, "scriptProvider");
            Guard.AgainstNull(databaseContextFactory, "databaseContextFactory");
            Guard.AgainstNull(databaseGateway, "databaseGateway");

            if (!serviceBusConfiguration.HasInbox)
            {
                throw new InvalidOperationException(Resources.NoInboxException);
            }

            _scriptProvider         = scriptProvider;
            _databaseContextFactory = databaseContextFactory;
            _databaseGateway        = databaseGateway;

            _idempotenceProviderName = idempotenceConfiguration.ProviderName;

            if (string.IsNullOrEmpty(_idempotenceProviderName))
            {
                throw new ApplicationException(string.Format(Resources.ProviderNameEmpty,
                                                             "IdempotenceService"));
            }

            _idempotenceConnectionString = idempotenceConfiguration.ConnectionString;

            if (string.IsNullOrEmpty(_idempotenceConnectionString))
            {
                throw new ApplicationException(string.Format(Resources.ConnectionStringEmpty,
                                                             "IdempotenceService"));
            }

            Guard.AgainstNull(idempotenceConfiguration, "configuration");

            using (
                var connection = _databaseContextFactory.Create(_idempotenceProviderName,
                                                                _idempotenceConnectionString))
                using (var transaction = connection.BeginTransaction())
                {
                    if (_databaseGateway.GetScalarUsing <int>(
                            RawQuery.Create(
                                _scriptProvider.Get(
                                    Script.IdempotenceServiceExists))) != 1)
                    {
                        throw new InvalidOperationException(Resources.IdempotenceDatabaseNotConfigured);
                    }

                    _databaseGateway.ExecuteUsing(
                        RawQuery.Create(
                            _scriptProvider.Get(
                                Script.IdempotenceInitialize))
                        .AddParameterValue(IdempotenceColumns.InboxWorkQueueUri,
                                           serviceBusConfiguration.Inbox.WorkQueueUri));

                    transaction.CommitTransaction();
                }
        }
예제 #8
0
 public IQuery Get(string key)
 {
     return(RawQuery.Create(_scriptProvider.Get("KeyStore.Get"))
            .AddParameterValue(Columns.Key, key));
 }
예제 #9
0
 public IQuery GetSequenceNumber(string name)
 {
     return(RawQuery.Create(_scriptProvider.Get("Projection.GetSequenceNumber"))
            .AddParameterValue(ProjectionPositionColumns.Name, name));
 }
예제 #10
0
 public IQuery GetId(string typeName)
 {
     return(new RawQuery(_scriptProvider.Get("EventTypeStore.GetId")).AddParameterValue(Columns.TypeName, typeName));
 }