/// <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)); }
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"); }
/// <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); }
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); }
/// <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); }
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); }
public Unsubscribe(IMultiSubjectMessaging worker, Action <IReadOnlyMessage> action) { this.action = action; this.worker = worker; }