Hi,
I've made an extension class I'm using as a bridge between RSB and a
WCF service. Thought I'd share it. Feel free to use it or comment it.

Typical usage:
var res = bus.SendAndWaitForReply<S3DownloadUrlResponse>(new
RequestS3DownloadUrl()
                {
                    CorrelationId = Guid.NewGuid(),
                    Token = orderToken
                });


using System.Collections.Generic;
using System.Linq;
using System.Text;
using Rhino.ServiceBus.Sagas;
using Rhino.ServiceBus;
using System.Threading;
using Rhino.ServiceBus.Internal;

namespace Rhino.ServiceBus
{
    public static class ReplyExtension
    {
        class ESBResult<R> : OccasionalConsumerOf<R>, IDisposable
        {
            ManualResetEvent waithandle;
            IServiceBus bus;
            IDisposable subscription;
            TimeSpan patience;

            public ESBResult(IServiceBus bus, ISagaMessage message,
TimeSpan patience)
            {
                this.bus = bus;

                this.patience = patience;
                waithandle = new ManualResetEvent(false);
                subscription = bus.AddInstanceSubscription(this);
                bus.Send(message);
            }

            public ESBResult(IServiceBus bus, ISagaMessage message)
                : this(bus, message, TimeSpan.FromSeconds(5))
            {
            }

            public R Reply
            {
                get
                {
                    waithandle.WaitOne(patience);
                    return m_Reply;
                }
            }

            #region ConsumerOf<R> Members

            R m_Reply = default(R);
            public void Consume(R message)
            {
                m_Reply = message;
                waithandle.Set();
            }

            #endregion

            #region IDisposable Members

            public void Dispose()
            {
                var b = bus;
                subscription.Dispose();
            }

            #endregion
        }

        public static R SendAndWaitForReply<R>(this IServiceBus bus,
ISagaMessage message)
        {
            using (var result = new ESBResult<R>(bus, message))
                return result.Reply;
        }
    }
}

-- 
You received this message because you are subscribed to the Google Groups 
"Rhino Tools Dev" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rhino-tools-dev?hl=en.

Reply via email to