Skip to content

Commit 9bc323f

Browse files
authored
Legacy docs review: Outbox sql sample (#7170)
1 parent 98b4bc8 commit 9bc323f

File tree

10 files changed

+162
-194
lines changed

10 files changed

+162
-194
lines changed

samples/outbox/sql/Core_9/Receiver/OrderLifecycleSaga.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,11 @@
44
using Microsoft.Extensions.Logging;
55
using NServiceBus.Persistence.Sql;
66

7-
public class OrderLifecycleSaga :
7+
sealed class OrderLifecycleSaga(ILogger<OrderLifecycleSaga> logger) :
88
SqlSaga<OrderLifecycleSaga.SagaData>,
99
IAmStartedByMessages<OrderSubmitted>,
1010
IHandleTimeouts<OrderTimeout>
1111
{
12-
private readonly ILogger<OrderLifecycleSaga> logger;
13-
14-
public OrderLifecycleSaga(ILogger<OrderLifecycleSaga> logger)
15-
{
16-
this.logger = logger;
17-
}
18-
1912
protected override void ConfigureMapping(IMessagePropertyMapper mapper)
2013
{
2114
mapper.ConfigureMapping<OrderSubmitted>(_ => _.OrderId);

samples/outbox/sql/Core_9/Receiver/OrderSubmittedHandler.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using NServiceBus;
44
using Microsoft.Extensions.Logging;
55

6-
public class OrderSubmittedHandler :
6+
sealed class OrderSubmittedHandler :
77
IHandleMessages<OrderSubmitted>
88
{
99
private readonly ILogger<OrderSubmittedHandler> logger;
@@ -15,7 +15,10 @@ public OrderSubmittedHandler(ILogger<OrderSubmittedHandler> logger)
1515

1616
public async Task Handle(OrderSubmitted message, IMessageHandlerContext context)
1717
{
18-
logger.LogInformation($"Order {message.OrderId} worth {message.Value} submitted");
18+
logger.LogInformation("Order {OrderId} worth {OrderValue} submitted",
19+
message.OrderId,
20+
message.Value
21+
);
1922

2023
#region StoreUserData
2124

@@ -24,10 +27,11 @@ public async Task Handle(OrderSubmitted message, IMessageHandlerContext context)
2427
var sql = @"insert into receiver.SubmittedOrder
2528
(Id, Value)
2629
values (@Id, @Value)";
27-
using (var command = new SqlCommand(
28-
cmdText: sql,
29-
connection: (SqlConnection)session.Connection,
30-
transaction: (SqlTransaction)session.Transaction))
30+
31+
await using (var command = new SqlCommand(
32+
cmdText: sql,
33+
connection: (SqlConnection)session.Connection,
34+
transaction: (SqlTransaction)session.Transaction))
3135
{
3236
var parameters = command.Parameters;
3337
parameters.AddWithValue("Id", message.OrderId);
@@ -39,13 +43,9 @@ public async Task Handle(OrderSubmitted message, IMessageHandlerContext context)
3943

4044
#region Reply
4145

42-
var orderAccepted = new OrderAccepted
43-
{
44-
OrderId = message.OrderId,
45-
};
46+
var orderAccepted = new OrderAccepted(OrderId: message.OrderId);
4647
await context.Reply(orderAccepted);
4748

4849
#endregion
4950
}
50-
51-
}
51+
}
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
public class OrderTimeout
2-
{
3-
}
1+
public record OrderTimeout;
Lines changed: 41 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,63 @@
11
using System;
22
using System.IO;
3-
using System.Threading.Tasks;
43
using Microsoft.Data.SqlClient;
54
using Microsoft.Extensions.Hosting;
65
using NServiceBus;
76
using NServiceBus.Transport.SqlServer;
87

9-
class Program
10-
{
11-
12-
public static async Task Main(string[] args)
8+
var host = Host.CreateDefaultBuilder(args)
9+
.ConfigureServices((hostContext, services) => { Console.Title = "Server"; })
10+
.UseNServiceBus(x =>
1311
{
14-
await CreateHostBuilder(args).Build().RunAsync();
15-
}
12+
Console.Title = "Receiver";
1613

17-
public static IHostBuilder CreateHostBuilder(string[] args) =>
18-
Host.CreateDefaultBuilder(args)
19-
.ConfigureServices((hostContext, services) =>
20-
{
21-
Console.Title = "Server";
22-
}).UseNServiceBus(x =>
23-
{
24-
Console.Title = "Receiver";
14+
//for local instance or SqlExpress
15+
//string connectionString = @"Data Source=(localdb)\mssqllocaldb;Database=NsbSamplesSqlOutbox;Trusted_Connection=True;MultipleActiveResultSets=true";
16+
var connectionString = @"Server=localhost,1433;Initial Catalog=NsbSamplesSqlOutbox;User Id=SA;Password=yourStrong(!)Password;Max Pool Size=100;Encrypt=false";
2517

26-
//for local instance or SqlExpress
27-
//string connectionString = @"Data Source=(localdb)\mssqllocaldb;Database=NsbSamplesSqlOutbox;Trusted_Connection=True;MultipleActiveResultSets=true";
28-
var connectionString = @"Server=localhost,1433;Initial Catalog=NsbSamplesSqlOutbox;User Id=SA;Password=yourStrong(!)Password;Max Pool Size=100;Encrypt=false";
18+
var endpointConfiguration = new EndpointConfiguration("Samples.SqlOutbox.Receiver");
19+
endpointConfiguration.EnableInstallers();
20+
endpointConfiguration.SendFailedMessagesTo("error");
2921

30-
var endpointConfiguration = new EndpointConfiguration("Samples.SqlOutbox.Receiver");
31-
endpointConfiguration.EnableInstallers();
32-
endpointConfiguration.SendFailedMessagesTo("error");
22+
#region ReceiverConfiguration
3323

34-
#region ReceiverConfiguration
24+
var transport = new SqlServerTransport(connectionString)
25+
{
26+
DefaultSchema = "receiver",
27+
TransportTransactionMode = TransportTransactionMode.ReceiveOnly
28+
};
29+
transport.SchemaAndCatalog.UseSchemaForQueue("error", "dbo");
30+
transport.SchemaAndCatalog.UseSchemaForQueue("audit", "dbo");
3531

36-
var transport = new SqlServerTransport(connectionString)
37-
{
38-
DefaultSchema = "receiver",
39-
TransportTransactionMode = TransportTransactionMode.ReceiveOnly
40-
};
41-
transport.SchemaAndCatalog.UseSchemaForQueue("error", "dbo");
42-
transport.SchemaAndCatalog.UseSchemaForQueue("audit", "dbo");
32+
var routing = endpointConfiguration.UseTransport(transport);
33+
routing.UseSchemaForEndpoint("Samples.SqlOutbox.Sender", "sender");
4334

44-
var routing = endpointConfiguration.UseTransport(transport);
45-
routing.UseSchemaForEndpoint("Samples.SqlOutbox.Sender", "sender");
35+
var persistence = endpointConfiguration.UsePersistence<SqlPersistence>();
36+
persistence.ConnectionBuilder(
37+
connectionBuilder: () => new SqlConnection(connectionString)
38+
);
39+
var dialect = persistence.SqlDialect<SqlDialect.MsSqlServer>();
40+
dialect.Schema("receiver");
41+
persistence.TablePrefix("");
4642

47-
var persistence = endpointConfiguration.UsePersistence<SqlPersistence>();
48-
persistence.ConnectionBuilder(
49-
connectionBuilder: () =>
50-
{
51-
return new SqlConnection(connectionString);
52-
});
53-
var dialect = persistence.SqlDialect<SqlDialect.MsSqlServer>();
54-
dialect.Schema("receiver");
55-
persistence.TablePrefix("");
43+
transport.Subscriptions.DisableCaching = true;
44+
transport.Subscriptions.SubscriptionTableName = new SubscriptionTableName(
45+
table: "Subscriptions",
46+
schema: "dbo"
47+
);
5648

57-
transport.Subscriptions.DisableCaching = true;
58-
transport.Subscriptions.SubscriptionTableName = new SubscriptionTableName(
59-
table: "Subscriptions",
60-
schema: "dbo");
49+
endpointConfiguration.EnableOutbox();
6150

62-
endpointConfiguration.EnableOutbox();
51+
endpointConfiguration.UseSerialization<SystemJsonSerializer>();
6352

64-
endpointConfiguration.UseSerialization<SystemJsonSerializer>();
53+
#endregion
6554

66-
#endregion
67-
SqlHelper.CreateSchema(connectionString, "receiver");
55+
SqlHelper.CreateSchema(connectionString, "receiver");
6856

69-
SqlHelper.ExecuteSql(connectionString, File.ReadAllText("Startup.sql"));
70-
return endpointConfiguration;
71-
});
57+
SqlHelper.ExecuteSql(connectionString, File.ReadAllText("Startup.sql"));
58+
return endpointConfiguration;
59+
})
60+
.Build();
7261

7362

74-
}
63+
await host.RunAsync();
Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,38 @@
11
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
52
using System.Threading;
63
using System.Threading.Tasks;
74
using Microsoft.Extensions.Hosting;
85
using NServiceBus;
9-
using NServiceBus.Routing;
106

11-
namespace Sender
7+
namespace Sender;
8+
9+
class InputLoopService(IMessageSession messageSession) : BackgroundService
1210
{
13-
public class InputLoopService(IMessageSession messageSession) : BackgroundService
11+
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
1412
{
15-
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
16-
{
17-
var random = new Random();
13+
var random = new Random();
1814

19-
while (true)
15+
while (true)
16+
{
17+
if (!Console.KeyAvailable)
2018
{
21-
var key = Console.ReadKey();
22-
Console.WriteLine();
19+
await Task.Delay(100, stoppingToken);
20+
continue;
21+
}
22+
var key = Console.ReadKey();
23+
Console.WriteLine();
2324

24-
if (key.Key != ConsoleKey.Enter)
25-
{
26-
break;
27-
}
28-
var orderSubmitted = new OrderSubmitted
29-
{
30-
OrderId = Guid.NewGuid(),
31-
Value = random.Next(100)
32-
};
33-
await messageSession.Publish(orderSubmitted);
25+
if (key.Key != ConsoleKey.Enter)
26+
{
27+
break;
3428
}
3529

30+
var orderSubmitted = new OrderSubmitted(
31+
OrderId: Guid.NewGuid(),
32+
Value: random.Next(100)
33+
);
34+
35+
await messageSession.Publish(orderSubmitted, cancellationToken: stoppingToken);
3636
}
3737
}
38-
}
38+
}

samples/outbox/sql/Core_9/Sender/OrderAcceptedHandler.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,12 @@
22
using NServiceBus;
33
using Microsoft.Extensions.Logging;
44

5-
public class OrderAcceptedHandler :
5+
sealed class OrderAcceptedHandler(ILogger<OrderAcceptedHandler> logger) :
66
IHandleMessages<OrderAccepted>
77
{
8-
private readonly ILogger<OrderAcceptedHandler> logger;
9-
public OrderAcceptedHandler(ILogger<OrderAcceptedHandler> logger)
10-
{
11-
this.logger = logger;
12-
}
13-
148
public Task Handle(OrderAccepted message, IMessageHandlerContext context)
159
{
16-
logger.LogInformation($"Order {message.OrderId} accepted.");
10+
logger.LogInformation("Order {OrderId} accepted", message.OrderId);
1711
return Task.CompletedTask;
1812
}
1913
}

0 commit comments

Comments
 (0)