public void Test_GetContext_NoContext()
        {
            DeferredChannelMessageContext context;

            context = DeferredChannelMessageContext.GetContext();
            Assert.That(context, Has.Property("ContextType").EqualTo(ContextType.Detached));
        }
        /// <summary>
        /// Flush any deferred messages.
        /// </summary>
        private void FlushDeferredMessageContextMessages()
        {
            if (!DeferredChannelMessageContext.IsSet())
            {
                return;
            }

            using (DeferredChannelMessageContext messageContext = DeferredChannelMessageContext.GetContext())
            {
                messageContext.FlushMessages();
            }
        }
Beispiel #3
0
        /// <summary>
        ///     Publish_s the implementation.
        /// </summary>
        /// <param name="callback">The callback.</param>
        /// <param name="message">The message.</param>
        /// <param name="publishMethod">The publish method.</param>
        /// <param name="options">The options.</param>
        /// <param name="publishToOriginator">if set to <c>true</c> [publish to originator].</param>
        /// <param name="mergeAction">The merge action.</param>
        /// <returns></returns>
        private Task <long> Publish_Impl(Func <T, PublishOptions, bool, Task <long> > callback, T message, PublishMethod publishMethod, PublishOptions options = PublishOptions.None, bool publishToOriginator = false, Action <T, T> mergeAction = null)
        {
            if (Equals(message, default(T)))
            {
                return(null);
            }

            if (Suppression.IsActive( ))
            {
                return(null);
            }

            DeferredChannelMessageContext deferredMessageContext = null;

            try
            {
                /////
                // If running in a delayed context, use the current message store.
                /////
                if (publishMethod == PublishMethod.Deferred)
                {
                    deferredMessageContext = DeferredChannelMessageContext.GetContext( );

                    if (deferredMessageContext.ContextType != ContextType.Attached && !DeferredChannelMessageContext.SuppressNoContextWarning)
                    {
                        EventLog.Application.WriteWarning("Channel {0} has been created with PublishMethod.Deferred with no DeferredChannelMessageContext set. Messages will be sent immediately. Either set a DeferredChannelMessageContext or publish the message with PublishMethod.Immediate.", ChannelName);
                    }
                }

                if (deferredMessageContext != null &&
                    deferredMessageContext.ContextType == ContextType.Attached)
                {
                    deferredMessageContext.AddOrUpdateMessage(ChannelName, message, mergeAction);
                }
                else
                {
                    return(callback(message, options, publishToOriginator));
                }
            }
            finally
            {
                if (deferredMessageContext != null)
                {
                    deferredMessageContext.Dispose( );
                }
            }

            return(null);
        }
        public void Test_GetContext()
        {
            Assert.That(DeferredChannelMessageContext.IsSet(), Is.False, "Set initially");

            using (DeferredChannelMessageContext newContext = new DeferredChannelMessageContext())
            {
                using (DeferredChannelMessageContext attachedContext = DeferredChannelMessageContext.GetContext())
                {
                    Assert.That(newContext.ContextType, Is.EqualTo(ContextType.New), "Incorrect context type");
                    Assert.That(attachedContext.ContextType, Is.EqualTo(ContextType.Attached), "Incorrect context type");
                }

                Assert.That(DeferredChannelMessageContext.IsSet(), Is.True, "Attached Dispose() removed context");
            }

            Assert.That(DeferredChannelMessageContext.IsSet(), Is.False, "New Dispose() did not remove context");
        }