Skip to content

Commit a97b7a1

Browse files
authored
Update bridge sql-multi-instance sample to NServiceBus 10 (#7516)
* Add baseline Bridge_5 copy from Bridge_3 for bridge sql-multi-instance * Update bridge sql-multi-instance sample to NServiceBus 10
1 parent d6b5b95 commit a97b7a1

File tree

15 files changed

+374
-0
lines changed

15 files changed

+374
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0</TargetFramework>
5+
<OutputType>Exe</OutputType>
6+
<LangVersion>preview</LangVersion>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<ProjectReference Include="..\Helpers\Helpers.csproj" />
11+
</ItemGroup>
12+
13+
<ItemGroup>
14+
<PackageReference Include="NServiceBus" Version="10.0.0-alpha.1" />
15+
<PackageReference Include="NServiceBus.MessagingBridge" Version="5.0.0-alpha.1" />
16+
<PackageReference Include="NServiceBus.Transport.SqlServer" Version="9.0.0-alpha.1" />
17+
</ItemGroup>
18+
19+
</Project>
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using System.Threading.Tasks;
2+
using Microsoft.Extensions.Hosting;
3+
using NServiceBus;
4+
5+
namespace Bridge
6+
{
7+
class Program
8+
{
9+
// for SqlExpress use Data Source=.\SqlExpress;Initial Catalog=NsbSamplesSqlMultiInstanceReceiver;Integrated Security=True;Max Pool Size=100;Encrypt=false
10+
const string ReceiverConnectionString = @"Server=localhost,1433;Initial Catalog=NsbSamplesSqlMultiInstanceReceiver;User Id=SA;Password=yourStrong(!)Password;Max Pool Size=100;Encrypt=false";
11+
12+
// for SqlExpress use Data Source=.\SqlExpress;Initial Catalog=NsbSamplesSqlMultiInstanceSender;Integrated Security=True;Max Pool Size=100;Encrypt=false
13+
const string SenderConnectionString = @"Server=localhost,1433;Initial Catalog=NsbSamplesSqlMultiInstanceSender;User Id=SA;Password=yourStrong(!)Password;Max Pool Size=100;Encrypt=false";
14+
15+
public static async Task Main()
16+
{
17+
SqlHelper.EnsureDatabaseExists(ReceiverConnectionString);
18+
SqlHelper.EnsureDatabaseExists(SenderConnectionString);
19+
20+
var builder = Host.CreateApplicationBuilder();
21+
var bridgeConfiguration = new BridgeConfiguration();
22+
23+
#region BridgeConfiguration
24+
25+
var receiverTransport = new BridgeTransport(new SqlServerTransport(ReceiverConnectionString))
26+
{
27+
Name = "Receiver",
28+
AutoCreateQueues = true
29+
};
30+
31+
receiverTransport.HasEndpoint("Samples.SqlServer.MultiInstanceReceiver");
32+
33+
var senderTransport = new BridgeTransport(new SqlServerTransport(SenderConnectionString))
34+
{
35+
Name = "Sender",
36+
AutoCreateQueues = true
37+
};
38+
39+
senderTransport.HasEndpoint("Samples.SqlServer.MultiInstanceSender");
40+
41+
bridgeConfiguration.AddTransport(receiverTransport);
42+
bridgeConfiguration.AddTransport(senderTransport);
43+
44+
// .NET 6 does not support distributed transactions
45+
bridgeConfiguration.RunInReceiveOnlyTransactionMode();
46+
47+
#endregion
48+
49+
// more configuration...
50+
51+
builder.UseNServiceBusBridge(bridgeConfiguration);
52+
var host = builder.Build();
53+
await host.RunAsync();
54+
}
55+
}
56+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0</TargetFramework>
5+
<LangVersion>preview</LangVersion>
6+
</PropertyGroup>
7+
8+
<ItemGroup>
9+
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.*" />
10+
</ItemGroup>
11+
12+
</Project>
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using Microsoft.Data.SqlClient;
2+
3+
public static class SqlHelper
4+
{
5+
public static void ExecuteSql(string connectionString, string sql)
6+
{
7+
EnsureDatabaseExists(connectionString);
8+
9+
using var connection = new SqlConnection(connectionString);
10+
connection.Open();
11+
12+
using var command = connection.CreateCommand();
13+
command.CommandText = sql;
14+
command.ExecuteNonQuery();
15+
}
16+
17+
public static void CreateSchema(string connectionString, string schema)
18+
{
19+
var sql = $@"
20+
if not exists (select *
21+
from sys.schemas
22+
where name = N'{schema}')
23+
exec('create schema {schema}');";
24+
ExecuteSql(connectionString, sql);
25+
}
26+
27+
public static void EnsureDatabaseExists(string connectionString)
28+
{
29+
var builder = new SqlConnectionStringBuilder(connectionString);
30+
var database = builder.InitialCatalog;
31+
32+
var masterConnection = connectionString.Replace(builder.InitialCatalog, "master");
33+
34+
using var connection = new SqlConnection(masterConnection);
35+
connection.Open();
36+
37+
using var command = connection.CreateCommand();
38+
command.CommandText = $@"
39+
if(db_id('{database}') is null)
40+
create database [{database}]
41+
";
42+
command.ExecuteNonQuery();
43+
}
44+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System.Threading.Tasks;
2+
using Messages;
3+
using NServiceBus;
4+
using NServiceBus.Logging;
5+
6+
public class OrderHandler :
7+
IHandleMessages<ClientOrder>
8+
{
9+
static ILog log = LogManager.GetLogger<OrderHandler>();
10+
11+
#region Reply
12+
13+
public Task Handle(ClientOrder message, IMessageHandlerContext context)
14+
{
15+
log.Info($"Handling ClientOrder with ID {message.OrderId}");
16+
var clientOrderAccepted = new ClientOrderResponse
17+
{
18+
OrderId = message.OrderId
19+
};
20+
return context.Reply(clientOrderAccepted);
21+
}
22+
23+
#endregion
24+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
4+
using NServiceBus;
5+
6+
class Program
7+
{
8+
//for local instance or SqlExpress
9+
// const string ConnectionString = @"Data Source=(localdb)\mssqllocaldb;Database=nservicebus;Trusted_Connection=True;MultipleActiveResultSets=true";
10+
const string ConnectionString = @"Server=localhost,1433;Initial Catalog=NsbSamplesSqlMultiInstanceReceiver;User Id=SA;Password=yourStrong(!)Password;Max Pool Size=100;Encrypt=false";
11+
12+
static async Task Main()
13+
{
14+
Console.Title = "MultiInstanceReceiver";
15+
16+
#region ReceiverConfiguration
17+
18+
var endpointConfiguration = new EndpointConfiguration("Samples.SqlServer.MultiInstanceReceiver");
19+
endpointConfiguration.UseTransport(new SqlServerTransport(ConnectionString));
20+
21+
endpointConfiguration.UseSerialization<SystemJsonSerializer>();
22+
endpointConfiguration.EnableInstallers();
23+
24+
#endregion
25+
26+
SqlHelper.EnsureDatabaseExists(ConnectionString);
27+
28+
var endpointInstance = await Endpoint.Start(endpointConfiguration);
29+
30+
Console.WriteLine("Press any key to exit");
31+
Console.WriteLine("Waiting for Order messages from the Sender");
32+
Console.ReadKey();
33+
await endpointInstance.Stop();
34+
}
35+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0</TargetFramework>
5+
<OutputType>Exe</OutputType>
6+
<LangVersion>preview</LangVersion>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<ProjectReference Include="..\Helpers\Helpers.csproj" />
11+
<ProjectReference Include="..\Shared\Shared.csproj" />
12+
</ItemGroup>
13+
14+
<ItemGroup>
15+
<PackageReference Include="NServiceBus.Transport.SqlServer" Version="9.0.0-alpha.1" />
16+
</ItemGroup>
17+
18+
</Project>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
Microsoft Visual Studio Solution File, Format Version 12.00
2+
# Visual Studio Version 16
3+
VisualStudioVersion = 16.0.29728.190
4+
MinimumVisualStudioVersion = 15.0.26730.12
5+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "Shared\Shared.csproj", "{A50E54FA-4AE8-4018-BBA4-B8ED7748F214}"
6+
EndProject
7+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Receiver", "Receiver\Receiver.csproj", "{ED0EC3CA-2B73-4E46-8CCA-DD390DF7A212}"
8+
EndProject
9+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sender", "Sender\Sender.csproj", "{E1B21EF8-51A7-43BF-ACD0-653898075D2A}"
10+
EndProject
11+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bridge", "Bridge\Bridge.csproj", "{96349083-6D8B-4CCD-9272-394A80C64A64}"
12+
EndProject
13+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Helpers", "Helpers\Helpers.csproj", "{9F1058B8-1423-4039-94B9-9052C5A7391D}"
14+
EndProject
15+
Global
16+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
17+
Debug|Any CPU = Debug|Any CPU
18+
EndGlobalSection
19+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
20+
{A50E54FA-4AE8-4018-BBA4-B8ED7748F214}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21+
{A50E54FA-4AE8-4018-BBA4-B8ED7748F214}.Debug|Any CPU.Build.0 = Debug|Any CPU
22+
{ED0EC3CA-2B73-4E46-8CCA-DD390DF7A212}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
23+
{ED0EC3CA-2B73-4E46-8CCA-DD390DF7A212}.Debug|Any CPU.Build.0 = Debug|Any CPU
24+
{E1B21EF8-51A7-43BF-ACD0-653898075D2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
25+
{E1B21EF8-51A7-43BF-ACD0-653898075D2A}.Debug|Any CPU.Build.0 = Debug|Any CPU
26+
{96349083-6D8B-4CCD-9272-394A80C64A64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
27+
{96349083-6D8B-4CCD-9272-394A80C64A64}.Debug|Any CPU.Build.0 = Debug|Any CPU
28+
{9F1058B8-1423-4039-94B9-9052C5A7391D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
29+
{9F1058B8-1423-4039-94B9-9052C5A7391D}.Debug|Any CPU.Build.0 = Debug|Any CPU
30+
EndGlobalSection
31+
GlobalSection(SolutionProperties) = preSolution
32+
HideSolutionNode = FALSE
33+
EndGlobalSection
34+
GlobalSection(ExtensibilityGlobals) = postSolution
35+
SolutionGuid = {E6DA9E93-1AB4-41D3-ACEE-52F370D07637}
36+
EndGlobalSection
37+
EndGlobal
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System.Threading.Tasks;
2+
using Messages;
3+
using NServiceBus;
4+
using NServiceBus.Logging;
5+
6+
public class ClientOrderResponseHandler :
7+
IHandleMessages<ClientOrderResponse>
8+
{
9+
static ILog log = LogManager.GetLogger<ClientOrderResponseHandler>();
10+
11+
public Task Handle(ClientOrderResponse message, IMessageHandlerContext context)
12+
{
13+
log.Info($"Received ClientOrderResponse for ID {message.OrderId}");
14+
return Task.CompletedTask;
15+
}
16+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
4+
using Messages;
5+
6+
using NServiceBus;
7+
8+
public class Program
9+
{
10+
// for SqlExpress use Data Source=.\SqlExpress;Initial Catalog=NsbSamplesSqlMultiInstanceSender;Integrated Security=True;Max Pool Size=100;Encrypt=false
11+
const string ConnectionString = @"Server=localhost,1433;Initial Catalog=NsbSamplesSqlMultiInstanceSender;User Id=SA;Password=yourStrong(!)Password;Max Pool Size=100;Encrypt=false";
12+
13+
static async Task Main()
14+
{
15+
Console.Title = "MultiInstanceSender";
16+
17+
#region SenderConfiguration
18+
19+
var endpointConfiguration = new EndpointConfiguration("Samples.SqlServer.MultiInstanceSender");
20+
var routing = endpointConfiguration.UseTransport(new SqlServerTransport(ConnectionString));
21+
22+
endpointConfiguration.UseSerialization<SystemJsonSerializer>();
23+
endpointConfiguration.EnableInstallers();
24+
25+
routing.RouteToEndpoint(typeof(ClientOrder), "Samples.SqlServer.MultiInstanceReceiver");
26+
27+
#endregion
28+
29+
SqlHelper.EnsureDatabaseExists(ConnectionString);
30+
31+
var endpointInstance = await Endpoint.Start(endpointConfiguration);
32+
33+
Console.WriteLine("Press <enter> to send a message");
34+
Console.WriteLine("Press any other key to exit");
35+
while (true)
36+
{
37+
if (Console.ReadKey().Key != ConsoleKey.Enter)
38+
{
39+
break;
40+
}
41+
await PlaceOrder(endpointInstance);
42+
}
43+
await endpointInstance.Stop();
44+
}
45+
46+
static async Task PlaceOrder(IEndpointInstance endpoint)
47+
{
48+
#region SendMessage
49+
50+
var order = new ClientOrder
51+
{
52+
OrderId = Guid.NewGuid()
53+
};
54+
await endpoint.Send(order);
55+
56+
#endregion
57+
58+
Console.WriteLine($"ClientOrder message sent with ID {order.OrderId}");
59+
}
60+
}

0 commit comments

Comments
 (0)