Exemplo n.º 1
0
        public virtual void RegisterTask(Func <AsyncCallback, IAsyncResult> beginDelegate,
                                         Action <IAsyncResult> endDelegate)
        {
            Precondition.Require(beginDelegate, () => Error.ArgumentNull("beginDelegate"));
            Precondition.Require(endDelegate, () => Error.ArgumentNull("endDelegate"));

            AsyncCallback callback = ar => {
                lock (_taskLock)
                {
                }
                if (!ar.CompletedSynchronously)
                {
                    Sync(() => endDelegate(ar));
                    OutstandingOperations.Decrement();
                }
            };

            OutstandingOperations.Increment();

            IAsyncResult asyncResult;

            lock (_taskLock)
            {
                asyncResult = beginDelegate(callback);
            }
            if (asyncResult.CompletedSynchronously)
            {
                endDelegate(asyncResult);
                OutstandingOperations.Decrement();
            }
        }
Exemplo n.º 2
0
        void ExecuteActionsAgainstRabbitMq(object sender, TransactionEventArgs transactionEventArgs)
        {
            var transactionInfo = transactionEventArgs.Transaction.TransactionInformation;

            if (transactionInfo.Status != TransactionStatus.Committed)
            {
                OutstandingOperations.Clear();
                return;
            }

            var transactionId = transactionInfo.LocalIdentifier;

            if (!OutstandingOperations.ContainsKey(transactionId))
            {
                return;
            }

            var actions = OutstandingOperations[transactionId];

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

            ExecuteRabbitMqActions(actions);

            OutstandingOperations.Clear();
        }
Exemplo n.º 3
0
        private void CommitTransaction(object sender, TransactionEventArgs e)
        {
            var transactionInfo = e.Transaction.TransactionInformation;

            if (transactionInfo.Status != TransactionStatus.Committed)
            {
                OutstandingOperations.Clear();
                return;
            }

            var transactionId = transactionInfo.LocalIdentifier;

            if (!OutstandingOperations.ContainsKey(transactionId))
            {
                return;
            }

            var messages = OutstandingOperations[transactionId];

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

            var result = connectionManager.GetConnection()
                         .AppendToStream(EndpointAddress.GetIntermediateOutgoingQueue(), ExpectedVersion.Any, messages);

            OutstandingOperations.Clear();
        }
        public void Add(Action <IModel> action)
        {
            var transaction = Transaction.Current;

            if (transaction == null)
            {
                ExecuteRabbitMqActions(new[]
                {
                    action
                });

                return;
            }

            var transactionId = transaction.TransactionInformation.LocalIdentifier;

            OutstandingOperations.AddOrUpdate(transactionId, s =>
            {
                transaction.TransactionCompleted += ExecuteActionsAgainstRabbitMq;
                return(new List <Action <IModel> >
                {
                    action
                });
            }, (s, list) =>
            {
                list.Add(action);
                return(list);
            });
        }
Exemplo n.º 5
0
        private IAsyncResult RegisterTaskInternal(Func <AsyncCallback, IAsyncResult> beginDelegate, AsyncCallback endDelegate)
        {
            AsyncCallback callback = ar => {
                Send(() => {
                    if (endDelegate != null)
                    {
                        endDelegate(ar);
                    }
                    OutstandingOperations.Decrement();
                });
            };

            OutstandingOperations.Increment();
            return(beginDelegate(callback));
        }
Exemplo n.º 6
0
        public void Send(EventData message)
        {
            var transaction   = Transaction.Current;
            var transactionId = transaction.TransactionInformation.LocalIdentifier;

            IList <EventData> messages;

            if (!OutstandingOperations.TryGetValue(transactionId, out messages))
            {
                messages = new List <EventData>();
                transaction.TransactionCompleted += CommitTransaction;
                OutstandingOperations.Add(transactionId, messages);
            }

            messages.Add(message);
        }
        void ExecuteActionsAgainstRabbitMq(object sender, TransactionEventArgs transactionEventArgs)
        {
            transactionEventArgs.Transaction.TransactionCompleted -= ExecuteActionsAgainstRabbitMq;

            var transactionInfo = transactionEventArgs.Transaction.TransactionInformation;
            var transactionId   = transactionInfo.LocalIdentifier;

            if (transactionInfo.Status != TransactionStatus.Committed)
            {
                return;
            }

            IList <Action <IModel> > actions;

            OutstandingOperations.TryRemove(transactionId, out actions);

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

            ExecuteRabbitMqActions(actions);
        }
Exemplo n.º 8
0
        public void Add(Action <IModel> action)
        {
            var transaction = Transaction.Current;

            if (transaction == null)
            {
                ExecuteRabbitMqActions(new[] { action });

                return;
            }

            var transactionId = transaction.TransactionInformation.LocalIdentifier;

            if (!OutstandingOperations.ContainsKey(transactionId))
            {
                transaction.TransactionCompleted += ExecuteActionsAgainstRabbitMq;
                OutstandingOperations.Add(transactionId, new List <Action <IModel> > {
                    action
                });
                return;
            }

            OutstandingOperations[transactionId].Add(action);
        }