public MartenBackedListenerContext()
        {
            theStore = DocumentStore.For(_ =>
            {
                _.Connection(ConnectionSource.ConnectionString);
                _.PLV8Enabled = false;
                _.Storage.Add <PostgresqlEnvelopeStorage>();
            });

            theStore.Advanced.Clean.CompletelyRemoveAll();

            theStore.Schema.ApplyAllConfiguredChangesToDatabase();

            theWorkerQueue = Substitute.For <IWorkerQueue>();

            theSettings = new BusSettings();

            var tables = new EnvelopeTables(theSettings, new StoreOptions());

            var retries = new MartenRetries(theStore, tables, CompositeTransportLogger.Empty(), theSettings);


            theListener = new MartenBackedListener(
                Substitute.For <IListeningAgent>(),
                theWorkerQueue,
                theStore,
                CompositeTransportLogger.Empty(), theSettings, tables, retries);
        }
        public ReassignFromDormantNodes(EnvelopeTables marker, JasperOptions settings)
        {
            _marker = marker;

            _reassignDormantNodeIncomingSql = $@"
update {marker.Incoming}
  set owner_id = 0
where
  owner_id in (
    select distinct owner_id from {marker.Incoming}
    where owner_id != 0 AND owner_id != {settings.UniqueNodeId} AND pg_try_advisory_xact_lock(owner_id)
  );

";

            _reassignDormantNodeOutgoingSql = $@"

update {marker.Outgoing}
  set owner_id = 0
where
  owner_id in (
    select distinct owner_id from {marker.Outgoing}
    where owner_id != 0 AND owner_id != {settings.UniqueNodeId} AND pg_try_advisory_xact_lock(owner_id)
  );
";
        }
        public static void StoreOutgoing(this IDocumentSession session, EnvelopeTables marker, Envelope envelope,
                                         int ownerId)
        {
            var operation = new StoreOutgoingEnvelope(marker.Outgoing, envelope, ownerId);

            session.QueueOperation(operation);
        }
        public run_scheduled_job_specs()
        {
            var logger         = TransportLogger.Empty();
            var envelopeTables = new EnvelopeTables(theSettings, new StoreOptions());
            var retries        = new EnvelopeRetries(new MartenEnvelopePersistor(theStore, envelopeTables), logger, theSettings);

            theScheduledJob = new RunScheduledJobs(theWorkerQueue, theStore, envelopeTables, logger, retries);
        }
        public MartenBackedRetryAgent(IDocumentStore store, ISender sender, RetrySettings settings, EnvelopeTables marker, CompositeTransportLogger logger) : base(sender, settings)
        {
            _store  = store;
            _marker = marker;
            _logger = logger;

            _deleteIncoming = $"delete from {_marker.Incoming} where id = ANY(:idlist)";
        }
 public static void StoreIncoming(this IDocumentSession session, EnvelopeTables marker, Envelope[] messages)
 {
     foreach (var envelope in messages)
     {
         var operation = new StoreIncomingEnvelope(marker.Incoming, envelope);
         session.QueueOperation(operation);
     }
 }
Beispiel #7
0
 public MartenCallback(Envelope envelope, IWorkerQueue queue, IDocumentStore store, EnvelopeTables marker, MartenRetries retries, ITransportLogger logger)
 {
     _envelope = envelope;
     _queue    = queue;
     _store    = store;
     _marker   = marker;
     _retries  = retries;
     _logger   = logger;
 }
Beispiel #8
0
 public LocalSendingAgent(Uri destination, IWorkerQueue queues, IDocumentStore store, EnvelopeTables marker, SerializationGraph serializers, MartenRetries retries, CompositeTransportLogger logger)
 {
     _queues      = queues;
     _store       = store;
     _marker      = marker;
     _serializers = serializers;
     _retries     = retries;
     _logger      = logger;
     Destination  = destination;
 }
Beispiel #9
0
 public MartenBackedSendingAgent(Uri destination, IDocumentStore store, ISender sender, CancellationToken cancellation, CompositeTransportLogger logger, BusSettings settings, EnvelopeTables marker, MartenRetries retries)
     : base(destination, sender, logger, settings, new MartenBackedRetryAgent(store, sender, settings.Retries, marker, logger))
 {
     _cancellation = cancellation;
     _logger       = logger;
     _store        = store;
     _settings     = settings;
     _marker       = marker;
     _retries      = retries;
 }
Beispiel #10
0
        public MartenBackedMessagePersistence(IDocumentStore store, CompositeTransportLogger logger, BusSettings settings, EnvelopeTables tables, BusMessageSerializationGraph serializers)
        {
            _store       = store;
            _logger      = logger;
            Settings     = settings;
            Tables       = tables;
            _serializers = serializers;

            _retries = new MartenRetries(_store, tables, _logger, Settings);
        }
Beispiel #11
0
        public RecoverIncomingMessages(IWorkerQueue workers, MessagingSettings settings, EnvelopeTables marker,
                                       ITransportLogger logger)
        {
            _workers  = workers;
            _settings = settings;
            _marker   = marker;
            _logger   = logger;

            _findAtLargeEnvelopesSql = $"select body from {marker.Incoming} where owner_id = {TransportConstants.AnyNode} and status = '{TransportConstants.Incoming}' limit {settings.Retries.RecoveryBatchSize}";
        }
 public MartenBackedListener(IListeningAgent agent, IWorkerQueue queues, IDocumentStore store, CompositeTransportLogger logger, BusSettings settings, EnvelopeTables marker, MartenRetries retries)
 {
     _agent    = agent;
     _queues   = queues;
     _store    = store;
     _logger   = logger;
     _settings = settings;
     _marker   = marker;
     _retries  = retries;
 }
        public RecoverOutgoingMessages(ISubscriberGraph subscribers, MessagingSettings settings, EnvelopeTables marker,
                                       ITransportLogger logger)
        {
            _subscribers = subscribers;
            _settings    = settings;
            _marker      = marker;
            _logger      = logger;

            _findUniqueDestinations   = $"select distinct destination from {_marker.Outgoing}";
            _findOutgoingEnvelopesSql = $"select body from {marker.Outgoing} where owner_id = {TransportConstants.AnyNode} and destination = :destination limit {settings.Retries.RecoveryBatchSize}";
            _deleteOutgoingSql        = $"delete from {marker.Outgoing} where owner_id = :owner and destination = :destination";
        }
Beispiel #14
0
        public RunScheduledJobs(IWorkerQueue workers, IDocumentStore store, EnvelopeTables marker, ITransportLogger logger, IRetries retries)
        {
            _workers = workers;
            _marker  = marker;
            _logger  = logger;
            _retries = retries;

            _persistor = new MartenEnvelopePersistor(store, _marker);

            _findReadyToExecuteJobs = $"select body from {marker.Incoming} where status = '{TransportConstants.Scheduled}' and execution_time <= :time";
            _markOwnedIncomingSql   = $"update {marker.Incoming} set owner_id = :owner, status = '{TransportConstants.Incoming}' where id = ANY(:idlist)";
        }
Beispiel #15
0
 public SchedulingAgent(ISubscriberGraph subscribers, IWorkerQueue workers, IDocumentStore store,
                        JasperOptions settings, ITransportLogger logger, StoreOptions storeOptions, IRetries retries,
                        EnvelopeTables tables)
     : base(settings, logger,
            new RunScheduledJobs(workers, store, tables, logger, retries),
            new RecoverIncomingMessages(workers, settings, tables, logger),
            new RecoverOutgoingMessages(subscribers, settings, tables, logger),
            new ReassignFromDormantNodes(tables, settings)
            )
 {
     _store = store;
 }
        public MartenBackedDurableMessagingFactory(IDocumentStore store, ITransportLogger logger,
                                                   JasperOptions settings, EnvelopeTables tables)
        {
            _store   = store;
            _logger  = logger;
            Settings = settings;
            Tables   = tables;

            _persistor = new MartenEnvelopePersistor(_store, tables);

            _retries = new EnvelopeRetries(new MartenEnvelopePersistor(_store, tables), _logger, Settings);
        }
Beispiel #17
0
        public MartenRetries(IDocumentStore store, EnvelopeTables tables, CompositeTransportLogger logger, BusSettings settings)
        {
            _store    = store;
            _tables   = tables;
            _logger   = logger;
            _settings = settings;

            _deleteIncoming         = new ActionBlock <Envelope[]>(deleteIncoming);
            _deleteIncomingBatching = new BatchingBlock <Envelope>(250.Milliseconds(), _deleteIncoming, settings.Cancellation);

            _deleteOutgoing         = new ActionBlock <Envelope[]>(deleteOutgoing);
            _deleteOutgoingBatching = new BatchingBlock <Envelope>(250.Milliseconds(), _deleteOutgoing, settings.Cancellation);

            _logErrorReport         = new ActionBlock <ErrorReport[]>(logErrorReports);
            _logErrorReportBatching = new BatchingBlock <ErrorReport>(250.Milliseconds(), _logErrorReport, settings.Cancellation);

            _scheduleIncoming         = new ActionBlock <Envelope[]>(scheduleIncoming);
            _scheduleIncomingBatching = new BatchingBlock <Envelope>(250.Milliseconds(), _scheduleIncoming, settings.Cancellation);
        }
Beispiel #18
0
        public MartenCallbackTests()
        {
            theRuntime = JasperRuntime.For(_ =>
            {
                _.MartenConnectionStringIs(Servers.PostgresConnectionString);

                _.ConfigureMarten(x =>
                {
                    x.Storage.Add <PostgresqlEnvelopeStorage>();
                    x.PLV8Enabled = false;
                });
            });

            theStore = theRuntime.Get <IDocumentStore>();

            theStore.Advanced.Clean.CompletelyRemoveAll();
            theStore.Schema.ApplyAllConfiguredChangesToDatabase();

            theEnvelope        = ObjectMother.Envelope();
            theEnvelope.Status = TransportConstants.Incoming;

            var marker = new EnvelopeTables(new MessagingSettings(), new StoreOptions());

            using (var session = theStore.OpenSession())
            {
                session.StoreIncoming(marker, theEnvelope);
                session.SaveChanges();
            }


            var logger = TransportLogger.Empty();

            theRetries = new EnvelopeRetries(new MartenEnvelopePersistor(theStore, marker), logger,
                                             new MessagingSettings());


            var persistor = new MartenEnvelopePersistor(theStore, marker);

            theCallback =
                new DurableCallback(theEnvelope, Substitute.For <IWorkerQueue>(), persistor, theRetries, logger);
        }
Beispiel #19
0
        public override void SetUp()
        {
            _envelopes.Clear();
            _nodeLockers.Clear();

            _workers        = new RecordingWorkerQueue();
            _schedulerAgent = new RecordingSchedulingAgent();

            _runtime = JasperRuntime.For(_ =>
            {
                _.MartenConnectionStringIs(Servers.PostgresConnectionString);
                _.Services.AddSingleton <ITransport, StubTransport>();

                _.Services.AddSingleton <IWorkerQueue>(_workers);
                _.Services.AddSingleton <ISchedulingAgent>(_schedulerAgent);

                _.Include <MartenBackedPersistence>();

                _.Settings.Alter <MessagingSettings>(x =>
                {
                    x.Retries.FirstNodeReassignmentExecution = 30.Minutes();
                    x.ScheduledJobs.FirstExecution           = 30.Minutes();
                    x.Retries.FirstNodeReassignmentExecution = 30.Minutes();
                    x.Retries.NodeReassignmentPollingTime    = 30.Minutes();
                });
            });

            _runtime.Get <MartenBackedDurableMessagingFactory>().ClearAllStoredMessages();

            _marker      = _runtime.Get <EnvelopeTables>();
            _serializers = _runtime.Get <MessagingSerializationGraph>();

            theStore = _runtime.Get <IDocumentStore>();
            theStore.Advanced.Clean.DeleteAllDocuments();

            _currentNodeId = _runtime.Get <MessagingSettings>().UniqueNodeId;

            _owners["This Node"] = _currentNodeId;
        }
 public MartenEnvelopePersistor(IDocumentStore store, EnvelopeTables tables)
 {
     _store  = store;
     _tables = tables;
 }