Example #1
0
    protected override async Task OnStart(IMessageSession session)
    {
        using var connection = await connectionBuilder(CancellationToken.None);

        var dedupeManager = new DedupeManager(connection, table);
        await dedupeManager.PurgeItems();
    }
    public async Task Integration()
    {
        await using (var connection = Connection.OpenConnection())
        {
            var manager = new DedupeManager(connection, "Deduplication");
            await manager.Create();
        }

        var endpoint = await StartEndpoint();

        var hostBuilder = new WebHostBuilder();

        hostBuilder.UseStartup <SampleStartup>();
        using (var server = new TestServer(hostBuilder))
        {
            using var client = server.CreateClient();
            client.DefaultRequestHeaders.Referrer = new("http://TheReferrer");
            var clientFormSender = new ClientFormSender(client);
            var guid             = Guid.NewGuid();
            var first            = await SendAsync(clientFormSender, guid);

            Assert.Equal(202, first);
            var second = await SendAsync(clientFormSender, guid);

            Assert.Equal(208, second);
        }

        Thread.Sleep(3000);

        await endpoint.Stop();

        Assert.Equal(1, count);
    }
    async Task CreateTable()
    {
        #region CreateDeduplicationTable

        var manager = new DedupeManager(sqlConnection, "DeduplicationTable");
        await manager.Create();

        #endregion
    }
    async Task DeleteTable()
    {
        #region DeleteDeduplicationTable

        var manager = new DedupeManager(sqlConnection, "DeduplicationTable");
        await manager.Drop();

        #endregion
    }
 public static async Task Run()
 {
     using (var connection = await ConnectionHelpers.OpenConnection(SqlHelper.ConnectionString)
                             .ConfigureAwait(false))
     {
         var dedupeManager = new DedupeManager(connection, "Deduplication");
         await dedupeManager.Create().ConfigureAwait(false);
     }
 }
Example #6
0
    async Task CreateTable()
    {
        #region CreateDeduplicationTable

        var queueManager = new DedupeManager(sqlConnection, "DeduplicationTable");
        await queueManager.Create().ConfigureAwait(false);

        #endregion
    }
    public async Task Install(string identity)
    {
        if (settings == null || settings.InstallerDisabled)
        {
            return;
        }

        using var connection = await settings.ConnectionBuilder(CancellationToken.None);

        var manager = new DedupeManager(connection, settings.Table);
        await manager.Create();
    }
Example #8
0
 /// <summary>
 /// Begins the cleanup process. This will run in the background until <see cref="Stop"/> is called.
 /// </summary>
 public virtual void Start()
 {
     cleaner = new DedupeCleaner(async cancellation =>
     {
         using var connection = await connectionBuilder(cancellation);
         var dedupeCleaner    = new DedupeManager(connection, table);
         var expiry           = DateTime.UtcNow.Subtract(expireWindow);
         await dedupeCleaner.CleanupItemsOlderThan(expiry, cancellation);
     },
                                 criticalError: criticalError,
                                 frequencyToRunCleanup: frequencyToRunCleanup,
                                 timer: new AsyncTimer());
     cleaner.Start();
 }
    public override async Task Invoke(IOutgoingPhysicalMessageContext context, Func <Task> next)
    {
        if (!DedupePipelineState.TryGet(context, out var dedupePipelineState))
        {
            await next();

            return;
        }

        var connectionTask = connectionBuilder(CancellationToken.None);

        if (context.Extensions.TryGet(out TransportTransaction _))
        {
            throw new NotSupportedException("Deduplication is currently designed to be used from outside the NServiceBus pipeline. For example to dedup messages being sent from inside a web service endpoint.");
        }

        var messageId = GetMessageId(context);

        var transportTransaction = new TransportTransaction();

        context.Extensions.Set(transportTransaction);
        await using var connection  = await connectionTask;
        await using var transaction = (SqlTransaction) await connection.BeginTransactionAsync();

        transportTransaction.Set(connection);
        transportTransaction.Set(transaction);

        var dedupeManager = new DedupeManager(transaction, table);
        var writeResult   = await dedupeManager.WriteDedupRecord(messageId, dedupePipelineState.Context);

        dedupePipelineState.DedupeOutcome = writeResult.DedupeOutcome;
        dedupePipelineState.Context       = writeResult.Context;
        if (dedupePipelineState.DedupeOutcome == DedupeOutcome.Deduplicated)
        {
            logger.Info($"Message deduplicated. MessageId: {messageId}");
            return;
        }

        await next();

        var commitResult = await dedupeManager.CommitWithDedupCheck(messageId, dedupePipelineState.Context);

        dedupePipelineState.DedupeOutcome = commitResult.DedupeOutcome;
        dedupePipelineState.Context       = commitResult.Context;
        if (commitResult.DedupeOutcome == DedupeOutcome.Deduplicated)
        {
            logger.Info($"Message deduplicated. MessageId: {messageId}");
        }
    }
    public async Task Integration()
    {
        await using (var connection = Connection.OpenConnection())
        {
            var manager = new DedupeManager(connection, "Deduplication");
            await manager.Create();

            await Installer.CreateTable(connection, "MessageAttachments");
        }

        var resetEvent = new ManualResetEvent(false);
        var endpoint   = await StartEndpoint(resetEvent);

        await SubmitMultipartForm();

        if (!resetEvent.WaitOne(TimeSpan.FromSeconds(2)))
        {
            throw new("OutgoingMessage not received");
        }

        await endpoint.Stop();
    }