Пример #1
0
        /// <summary>Adds a Rx subscription to a <see cref="IMultiSubjectMessaging"/></summary>
        /// <returns>A <see cref="IDisposable"/> that calls <see cref="IMultiSubjectMessaging.Unsubscribe(Action{IReadOnlyMessage})"/> when it is disposed</returns>
        public static IDisposable Subscribe(this IMultiSubjectMessaging worker, MessageSubject ms)
        {
            Action <IReadOnlyMessage> action = msg => ms.OnNext(msg);

            worker.Subscribe(action);
            return(new Unsubscribe(worker, action));
        }
Пример #2
0
        public Program()
        {
            var factory = new CompositeMessagingFactory(new MsmqMessagingFactory(), new RvMessagingFactory());

            rvMessaging = factory.CreateMultiSubject("rv://7500/pong");
            rvMessaging.Subscribe(OnRvPong);

            mqMessaging = factory.Create("msmq://localhost/private$/ping?express=true");
        }
Пример #3
0
        /// <summary>Starts a worker Task which dispatches messages in a loop, checking for cancellation every <paramref name="pollInterval"/></summary>
        /// <param name="messaging"></param>
        /// <param name="cancel">Allows cancellation of the returned Task</param>
        /// <param name="pollInterval">Defaults to 100ms</param>
        public static Task Start(this IMultiSubjectMessaging messaging, CancellationToken cancel = default(CancellationToken), TimeSpan?pollInterval = null)
        {
            var poll = pollInterval.GetValueOrDefault(TimeSpan.FromMilliseconds(100));

            return(Task.Factory.StartNew(() =>
            {
                while (!cancel.IsCancellationRequested)
                {
                    messaging.DispatchMessage(poll);
                }
            }, cancel, TaskCreationOptions.LongRunning, TaskScheduler.Current));
        }
 public bool TryCreateMultiSubject(Uri address, out IMultiSubjectMessaging subscriptionGroup)
 {
     foreach (var f in factories)
     {
         if (f.TryCreateMultiSubject(address, out subscriptionGroup))
         {
             return(true);
         }
     }
     subscriptionGroup = null;
     return(false);
 }
Пример #5
0
        public bool TryCreateMultiSubject(Uri address, out IMultiSubjectMessaging subscriptionGroup)
        {
            QueueDetails details;
            var          q = Converter.GetOrAddQueue(address, out details);

            if (q == null)
            {
                subscriptionGroup = null;
                return(false);
            }
            subscriptionGroup = new MsmqMultiSubjectMessaging(address, q, details);
            return(true);
        }
Пример #6
0
        /// <summary>Create a <see cref="IMultiSubjectMessaging"/> for a <paramref name="address"/></summary>
        /// <param name="address">The URL to create</param>
        /// <example>To create a <see cref="IMultiSubjectMessaging"/> to an MSMQ public queue: msmq://Computer/queue</example>
        /// <example>To create a <see cref="IMultiSubjectMessaging"/> to an MSMQ private queue: msmq://Computer/PRIVATE$/queue</example>
        /// <exception cref="ArgumentNullException">If <paramref name="address"/> is null</exception>
        /// <exception cref="ArgumentOutOfRangeException">If no transport can be created for the <paramref name="address"/></exception>
        public static IMultiSubjectMessaging CreateMultiSubject(this IMessagingFactory factory, Uri address)
        {
            if (factory == null)
            {
                throw new ArgumentNullException(nameof(factory));
            }

            IMultiSubjectMessaging messaging = null;

            factory?.TryCreateMultiSubject(address, out messaging);
            if (messaging == null)
            {
                throw new ArgumentOutOfRangeException(nameof(address), "Don't know how to create transport for " + address);
            }
            return(messaging);
        }
Пример #7
0
        public bool TryCreateMultiSubject(Uri address, out IMultiSubjectMessaging subscriptionGroup)
        {
            if (!address.Scheme.IsRvScheme())
            {
                subscriptionGroup = null;
                return(false);
            }

            var service = address.Host;
            var config  = GetConfig(service);

            var netTrans = new Rv.NetTransport(service, config.Network, config.Daemon);

            switch (address.Scheme)
            {
            case "rv+cm":
                if (string.IsNullOrEmpty(config.CmName))
                {
                    ThrowCmNameNotConfigured();
                }
                var cmt = new Rv.CMTransport(netTrans);     //TODO: what about ledger files?
                subscriptionGroup = new RvMultiSubjectMessaging(cmt, address);
                break;

            case "rv+dq":
                if (string.IsNullOrEmpty(config.CmName))
                {
                    ThrowCmNameNotConfigured();
                }
                var dqt = new Rv.CMQueueTransport(netTrans, config.CmName);     //TODO: other queue parameters need configuring
                subscriptionGroup = new RvMultiSubjectMessaging(dqt, address);
                break;

            default:
                subscriptionGroup = new RvMultiSubjectMessaging(netTrans, address);
                break;
            }
            return(true);
        }
Пример #8
0
 public Unsubscribe(IMultiSubjectMessaging worker, Action <IReadOnlyMessage> action)
 {
     this.action = action;
     this.worker = worker;
 }