public void Initialize(IServiceBus bus)
        {
            _serviceBusConfiguration = bus.Configuration;

            using (_databaseContextFactory.Create(SqlServerConfiguration.ProviderName, _subscriptionConnectionString))
            {
                if (_databaseGateway.GetScalarUsing <int>(
                        RawQuery.Create(
                            _scriptProvider.GetScript(
                                Script.SubscriptionManagerExists))) != 1)
                {
                    try
                    {
                        _databaseGateway.ExecuteUsing(RawQuery.Create(
                                                          _scriptProvider.GetScript(
                                                              Script.SubscriptionManagerCreate)));
                    }
                    catch (Exception ex)
                    {
                        if (!ex.Message.Equals("There is already an object named 'SubscriberMessageType' in the database.", StringComparison.OrdinalIgnoreCase))
                        {
                            throw new DataException(SqlResources.SubscriptionManagerCreateException, ex);
                        }
                    }
                }
            }

            if (HasDeferredSubscriptions)
            {
                Subscribe(_deferredSubscriptions);
            }
        }
예제 #2
0
 public bool Contains(TransportMessage transportMessage)
 {
     using (databaseConnectionFactory.Create(IdempotenceDataSource))
     {
         return(databaseGateway.GetScalarUsing <int>(
                    IdempotenceDataSource,
                    RawQuery.CreateFrom(
                        scriptProvider.GetScript(
                            Script.IdempotenceTrackerContains))
                    .AddParameterValue(IdempotenceTrackerColumns.MessageId, transportMessage.MessageId)) == 1);
     }
 }
예제 #3
0
 private void BuildQueries()
 {
     existsQuery             = RawQuery.CreateFrom(scriptProvider.GetScript(Script.QueueExists, tableName));
     createQuery             = RawQuery.CreateFrom(scriptProvider.GetScript(Script.QueueCreate, tableName));
     dropQuery               = RawQuery.CreateFrom(scriptProvider.GetScript(Script.QueueDrop, tableName));
     purgeQuery              = RawQuery.CreateFrom(scriptProvider.GetScript(Script.QueuePurge, tableName));
     dequeueQuery            = RawQuery.CreateFrom(scriptProvider.GetScript(Script.QueueDequeue, tableName));
     countQuery              = RawQuery.CreateFrom(scriptProvider.GetScript(Script.QueueCount, tableName));
     enqueueQueryStatement   = scriptProvider.GetScript(Script.QueueEnqueue, tableName);
     removeQueryStatement    = scriptProvider.GetScript(Script.QueueRemove, tableName);
     dequeueIdQueryStatement = scriptProvider.GetScript(Script.QueueDequeueId, tableName);
 }
예제 #4
0
        public void Initialize(IServiceBus bus)
        {
            _serviceBusConfiguration = bus.Configuration;

            using (_databaseContextFactory.Create(SqlServerConfiguration.ProviderName, _subscriptionConnectionString))
            {
                if (_databaseGateway.GetScalarUsing <int>(
                        RawQuery.Create(
                            _scriptProvider.GetScript(
                                Script.SubscriptionManagerExists))) != 1)
                {
                    throw new SubscriptionManagerException(SqlResources.SubscriptionManagerDatabaseNotConfigured);
                }
            }

            if (HasDeferredSubscriptions)
            {
                Subscribe(_deferredSubscriptions);
            }
        }
        public void Initialize(IServiceBus bus)
        {
            serviceBusConfiguration = bus.Configuration;

            using (databaseConnectionFactory.Create(_subscriptionDataSource))
            {
                if (databaseGateway.GetScalarUsing <int>(
                        _subscriptionDataSource,
                        RawQuery.Create(
                            scriptProvider.GetScript(
                                Script.SubscriptionManagerExists))) != 1)
                {
                    throw new SubscriptionManagerException(SqlResources.SubscriptionManagerDatabaseNotConfigured);
                }
            }

            if (HasDeferredSubscriptions)
            {
                Subscribe(deferredSubscriptions);
            }
        }
예제 #6
0
        public ReceivedMessage GetMessage()
        {
            lock (_padlock)
            {
                try
                {
                    using (_databaseConnectionFactory.Create(_dataSource))
                    {
                        var messageIds = _unacknowledgedMessages.Count > 0
                                                                                         ? _unacknowledgedMessages.Select(unacknowledgedMessage => unacknowledgedMessage.MessageId)
                                                                                         : _emptyMessageIds;

                        var row = _databaseGateway.GetSingleRowUsing(
                            _dataSource,
                            RawQuery.Create(
                                _scriptProvider.GetScript(
                                    Script.QueueDequeue,
                                    _tableName,
                                    string.Join(",", messageIds.Select(id => string.Format("'{0}'", id)).ToArray()))));

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

                        var result    = new MemoryStream((byte[])row["MessageBody"]);
                        var messageId = new Guid(row["MessageId"].ToString());

                        MessageIdAcknowledgementRequired((int)row["SequenceId"], messageId);

                        return(new ReceivedMessage(result, messageId));
                    }
                }
                catch (Exception ex)
                {
                    _log.Error(string.Format(SqlResources.DequeueError, Uri, ex.Message, _createQuery));

                    throw;
                }
            }
        }
        public void Initialize(IServiceBus bus)
        {
            using (var connection = _databaseConnectionFactory.Create(_idempotenceDataSource))
                using (var transaction = connection.BeginTransaction())
                {
                    if (_databaseGateway.GetScalarUsing <int>(
                            _idempotenceDataSource,
                            RawQuery.Create(
                                _scriptProvider.GetScript(
                                    Script.IdempotenceServiceExists))) != 1)
                    {
                        throw new IdempotenceServiceException(SqlResources.IdempotenceDatabaseNotConfigured);
                    }

                    _databaseGateway.ExecuteUsing(
                        _idempotenceDataSource,
                        RawQuery.Create(
                            _scriptProvider.GetScript(
                                Script.IdempotenceInitialize))
                        .AddParameterValue(IdempotenceColumns.InboxWorkQueueUri, bus.Configuration.Inbox.WorkQueue.Uri.ToString()));

                    transaction.CommitTransaction();
                }
        }
        public ProcessingStatus ProcessingStatus(TransportMessage transportMessage)
        {
            try
            {
                using (
                    var connection = _databaseContextFactory.Create(SqlServerConfiguration.ProviderName,
                                                                    _idempotenceConnectionString))
                    using (var transaction = connection.BeginTransaction())
                    {
                        try
                        {
                            if (_databaseGateway.GetScalarUsing <int>(
                                    RawQuery.Create(
                                        _scriptProvider.GetScript(
                                            Script.IdempotenceHasCompleted))
                                    .AddParameterValue(IdempotenceColumns.MessageId, transportMessage.MessageId)) == 1)
                            {
                                return(Esb.ProcessingStatus.Ignore);
                            }

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

                            _databaseGateway.ExecuteUsing(
                                RawQuery.Create(
                                    _scriptProvider.GetScript(
                                        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.GetScript(
                                        Script.IdempotenceIsMessageHandled))
                                .AddParameterValue(IdempotenceColumns.MessageId, transportMessage.MessageId)) == 1;

                            return(messageHandled
                                                        ? Esb.ProcessingStatus.MessageHandled
                                                        : Esb.ProcessingStatus.Assigned);
                        }
                        finally
                        {
                            transaction.CommitTransaction();
                        }
                    }
            }
            catch (SqlException 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;
            }
        }