public static IDisposable StartTimer(this IBusBase messageBus, string topic, int delayMs = 5000, int intervalMs = 10000)
        {
            Assert.ArgumentNotNull(messageBus, nameof(messageBus));

            var module = GetModule(messageBus);

            return(module.AddNewTimer(topic, delayMs, intervalMs));
        }
示例#2
0
        /// <summary>
        /// Schedule the provided event source with the system. It will be polled periodically for new events.
        /// </summary>
        /// <param name="messageBus"></param>
        /// <param name="source"></param>
        /// <returns></returns>
        public static IDisposable RunEventSource(this IBusBase messageBus, IEventSource source)
        {
            Assert.ArgumentNotNull(messageBus, nameof(messageBus));

            var module = GetModuleOrThrow(messageBus);

            return(module.RunEventSource(source));
        }
示例#3
0
        /// <summary>
        /// Get a direct reference to the OutboxMonitor, which holds the outboxes and periodically flushes them
        /// </summary>
        /// <param name="messageBus"></param>
        /// <returns></returns>
        public static IOutboxMonitor GetOutboxMonitor(this IBusBase messageBus)
        {
            Assert.ArgumentNotNull(messageBus, nameof(messageBus));

            var module = GetOutboxModuleOrThrow(messageBus);

            return(module.Monitor);
        }
示例#4
0
        public OutboxModule(IBusBase messageBus, int pollDelayMs)
        {
            Assert.ArgumentNotNull(messageBus, nameof(messageBus));
            Assert.IsInRange(pollDelayMs, nameof(pollDelayMs), 1000, int.MaxValue);

            _messageBus = messageBus;
            Monitor     = new OutboxMonitor(messageBus.Logger, messageBus.WorkerPool, pollDelayMs);
        }
示例#5
0
        /// <summary>
        /// Add the outbox to be monitored by the OutboxModule, if the module has been initialized.
        /// Otherwise do nothing
        /// </summary>
        /// <param name="messageBus"></param>
        /// <param name="outbox"></param>
        /// <returns></returns>
        public static IDisposable TryAddOutboxToBeMonitored(this IBusBase messageBus, IOutboxSender outbox)
        {
            Assert.ArgumentNotNull(messageBus, nameof(messageBus));
            Assert.ArgumentNotNull(outbox, nameof(outbox));

            var module = messageBus.Modules.Get <OutboxModule>();

            return(module?.AddOutboxToBeMonitored(outbox) ?? new DoNothingDisposable());
        }
示例#6
0
        /// <summary>
        /// Add the outbox to be monitored by the OutboxModule
        /// </summary>
        /// <param name="messageBus"></param>
        /// <param name="outbox"></param>
        /// <returns></returns>
        public static IDisposable AddOutboxToBeMonitored(this IBusBase messageBus, IOutboxSender outbox)
        {
            Assert.ArgumentNotNull(messageBus, nameof(messageBus));
            Assert.ArgumentNotNull(outbox, nameof(outbox));

            var module = GetOutboxModuleOrThrow(messageBus);

            return(module.AddOutboxToBeMonitored(outbox));
        }
示例#7
0
        /// <summary>
        /// Add the outbox to be monitored by the OutboxModule
        /// </summary>
        /// <typeparam name="TMessage"></typeparam>
        /// <param name="messageBus"></param>
        /// <param name="outbox"></param>
        /// <param name="send"></param>
        /// <returns></returns>
        public static IDisposable AddOutboxToBeMonitored <TMessage>(this IBusBase messageBus, IOutbox <TMessage> outbox, Action <Envelope <TMessage> > send)
        {
            Assert.ArgumentNotNull(messageBus, nameof(messageBus));
            Assert.ArgumentNotNull(outbox, nameof(outbox));
            Assert.ArgumentNotNull(send, nameof(send));

            var module = GetOutboxModuleOrThrow(messageBus);

            return(module.AddOutboxToBeMonitored(outbox, send));
        }
示例#8
0
        private static RabbitModule GetRabbitModuleOrThrow(IBusBase messageBus)
        {
            var module = messageBus.Modules.Get <RabbitModule>();

            if (module == null)
            {
                throw new Exception($"RabbitMQ is not initialized. Call .{nameof(InitializeRabbitMq)}() first.");
            }
            return(module);
        }
示例#9
0
        private static TestingModule GetTestingModule(IBusBase messageBus)
        {
            var module = messageBus.Modules.Get <TestingModule>();

            if (module == null)
            {
                throw new Exception($"Testing module is not initialized. Call .{nameof(InitializeTesting)}() first");
            }
            return(module);
        }
示例#10
0
        public static IDisposable PullRabbitMqToLocal <TPayload>(this IBusBase messageBus, Action <IRabbitConsumerBuilderRemoteTopic <TPayload> > setup)
            where TPayload : class
        {
            var module  = GetRabbitModuleOrThrow(messageBus);
            var builder = module.CreateSubscriberBuilder <TPayload>();

            setup(builder);
            var receiver = builder.Build();

            return(module.ManageConsumer(receiver));
        }
        public OutboxSubscription(IBusBase messageBus, ISubscription <TPayload> inner, IOutbox <TPayload> outbox)
        {
            Assert.ArgumentNotNull(messageBus, nameof(messageBus));
            Assert.ArgumentNotNull(inner, nameof(inner));
            Assert.ArgumentNotNull(outbox, nameof(outbox));

            _inner = inner;
            var sender      = new OutboxSender <TPayload>(messageBus.Logger, outbox, PublishInternal);
            var outboxToken = messageBus.TryAddOutboxToBeMonitored(sender);

            _outbox = new SendingOutbox <TPayload>(outbox, sender, outboxToken);
        }
示例#12
0
        public ForwardToRabbitSubscription(IBusBase messageBus, IBus rabbitBus, string queueName, IOutbox <TPayload> outbox)
        {
            Assert.ArgumentNotNull(messageBus, nameof(messageBus));
            Assert.ArgumentNotNull(rabbitBus, nameof(rabbitBus));
            Assert.ArgumentNotNull(outbox, nameof(outbox));

            _rabbitBus = rabbitBus;
            _queueName = queueName;
            var sender      = new OutboxSender <TPayload>(messageBus.Logger, outbox, PublishInternal);
            var outboxToken = messageBus.AddOutboxToBeMonitored(sender);

            _outbox = new SendingOutbox <TPayload>(outbox, sender, outboxToken);
        }
示例#13
0
 private static EventSourceModule GetModuleOrThrow(IBusBase messageBus)
 {
     return(messageBus.Modules.Get <EventSourceModule>() ?? throw new Exception($"EventSource module is not enabled. Call .{nameof(InitializeEventSources)}() first"));
 }
示例#14
0
        private static OutboxModule GetOutboxModuleOrThrow(IBusBase messageBus)
        {
            var module = messageBus.Modules.Get <OutboxModule>();

            return(module ?? throw new Exception($"Outbox module has not been initialized. Call .{nameof(InitializeOutboxModule)} first."));
        }
示例#15
0
 /// <summary>
 /// Schedule the given action to run as an event source. The system will invoke it periodically.
 /// </summary>
 /// <param name="messageBus"></param>
 /// <param name="action"></param>
 /// <returns></returns>
 public static IDisposable RunEventSource(this IBusBase messageBus, Action <IEventSourceContext> action)
 {
     return(RunEventSource(messageBus, new DelegateEventSource(action)));
 }
示例#16
0
 public static PublishExpectation <TPayload> ExpectPublish <TPayload>(this IBusBase messageBus, string topic, Func <TPayload, bool> filter = null, string description = null)
 {
     return(GetTestingModule(messageBus).ExpectPublish(topic, filter, description));
 }
示例#17
0
 public static ScatterExpectation <TRequest, TResponse> ExpectScatter <TRequest, TResponse>(this IBusBase messageBus, string topic, Func <TRequest, bool> filter = null, string description = null)
 {
     return(GetTestingModule(messageBus).ExpectScatter <TRequest, TResponse>(topic, filter, description));
 }
 private static MessageTimerModule GetModule(IBusBase messageBus)
 {
     return(messageBus.Modules.Get <MessageTimerModule>() ?? throw new Exception($"Message Timer module is not initialized. Call .{nameof(InitializeMessageTimer)}() first"));
 }
示例#19
0
        /// <summary>
        /// Initialize the OutboxModule, for automatic monitoring of outboxes in the system
        /// This method must be called before any other outbox-related methods
        /// </summary>
        /// <param name="messageBus"></param>
        /// <param name="pollDelayMs"></param>
        /// <returns></returns>
        public static IDisposable InitializeOutboxModule(this IBusBase messageBus, int pollDelayMs = 5000)
        {
            Assert.ArgumentNotNull(messageBus, nameof(messageBus));

            return(messageBus.Modules.Add(new OutboxModule(messageBus, pollDelayMs)));
        }
 public static ISubscription <TPayload> WrapSubscription(IBusBase messageBus, ISubscription <TPayload> inner, IOutbox <TPayload> outbox)
 {
     return(outbox == null ? inner : new OutboxSubscription <TPayload>(messageBus, inner, outbox));
 }
示例#21
0
        public static ISubscriberReference <TPayload> CreateRabbitMqForwardingSubscription <TPayload>(this IBusBase messageBus, Action <IRabbitSenderBuilder <TPayload> > setup)
        {
            Assert.ArgumentNotNull(messageBus, nameof(messageBus));
            Assert.ArgumentNotNull(setup, nameof(setup));

            var module  = GetRabbitModuleOrThrow(messageBus);
            var builder = module.CreatePublisherBuilder <TPayload>();

            setup(builder);
            return(builder.Build());
        }
示例#22
0
        /// <summary>
        /// Factory method for a new InMemoryOutbox which will automatically be monitored by the OutboxModule
        /// </summary>
        /// <typeparam name="TMessage"></typeparam>
        /// <param name="messageBus"></param>
        /// <param name="send"></param>
        /// <param name="maxMessages"></param>
        /// <returns></returns>
        public static OutboxAndToken <TMessage> GetMonitoredInMemoryOutbox <TMessage>(this IBusBase messageBus, Action <Envelope <TMessage> > send, int maxMessages = 100)
        {
            Assert.ArgumentNotNull(messageBus, nameof(messageBus));
            Assert.ArgumentNotNull(send, nameof(send));

            var module = GetOutboxModuleOrThrow(messageBus);
            var outbox = new InMemoryOutbox <TMessage>(maxMessages);
            var token  = module.AddOutboxToBeMonitored(outbox, send);

            return(new OutboxAndToken <TMessage>(outbox, token));
        }
示例#23
0
 public ReadOnlyModules(IBusBase messageBus)
 {
     _messageBus = messageBus;
 }
        public static bool IsMessageTimerInitialized(this IBusBase messageBus)
        {
            var module = messageBus.Modules.Get <MessageTimerModule>();

            return(module != null);
        }