Skip to content

Commit c43af1d

Browse files
irinascurtubording
andauthored
Unobtrusive sample for .NET 10 (#7496)
* Added the project for .NET 10 * Clean up project files * Use ClaimCheck package * Remove InputLoopService --------- Co-authored-by: Brandon Ording <[email protected]>
1 parent a5ee82c commit c43af1d

32 files changed

+453
-52
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0</TargetFramework>
5+
<OutputType>Exe</OutputType>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<Nullable>enable</Nullable>
8+
<LangVersion>preview</LangVersion>
9+
</PropertyGroup>
10+
11+
<ItemGroup>
12+
<ProjectReference Include="..\Shared\Shared.csproj" />
13+
</ItemGroup>
14+
15+
<ItemGroup>
16+
<PackageReference Include="NServiceBus" Version="10.0.0-alpha.4" />
17+
<PackageReference Include="NServiceBus.ClaimCheck" Version="2.0.0-alpha.2" />
18+
<PackageReference Include="NServiceBus.Extensions.Hosting" Version="4.0.0-alpha.2" />
19+
</ItemGroup>
20+
21+
<ItemGroup>
22+
<Compile Include="..\ConventionExtensions.cs" />
23+
</ItemGroup>
24+
25+
</Project>
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using Commands;
2+
using Messages;
3+
4+
public class CommandSender
5+
{
6+
public static async Task Start(IMessageSession messageSession)
7+
{
8+
Console.WriteLine("Press 'C' to send a command");
9+
Console.WriteLine("Press 'R' to send a request");
10+
Console.WriteLine("Press 'D' to send a large message that is marked to be sent using data bus");
11+
Console.WriteLine("Press 'X' to send a message that is marked with expiration time.");
12+
Console.WriteLine("Press any other key to exit");
13+
14+
while (true)
15+
{
16+
var key = Console.ReadKey();
17+
Console.WriteLine();
18+
19+
switch (key.Key)
20+
{
21+
case ConsoleKey.C:
22+
await SendCommand(messageSession);
23+
continue;
24+
case ConsoleKey.R:
25+
await SendRequest(messageSession);
26+
continue;
27+
case ConsoleKey.D:
28+
await Data(messageSession);
29+
continue;
30+
case ConsoleKey.X:
31+
await Expiration(messageSession);
32+
continue;
33+
}
34+
return;
35+
36+
}
37+
}
38+
39+
// Shut down server before sending this message, after 30 seconds, the message will be moved to Transactional dead-letter messages queue.
40+
static Task Expiration(IMessageSession messageSession)
41+
{
42+
var messageThatExpires = new MessageThatExpires
43+
{
44+
RequestId = Guid.NewGuid()
45+
};
46+
Console.WriteLine("message with expiration was sent");
47+
return messageSession.Send("Samples.Unobtrusive.Server", messageThatExpires);
48+
}
49+
50+
static Task Data(IMessageSession messageSession)
51+
{
52+
var requestId = Guid.NewGuid();
53+
54+
var largeMessage = new LargeMessage
55+
{
56+
RequestId = requestId,
57+
LargeClaimCheck = new byte[1024 * 1024 * 5]
58+
};
59+
Console.WriteLine($"Request sent id: {requestId}");
60+
return messageSession.Send("Samples.Unobtrusive.Server", largeMessage);
61+
}
62+
63+
static Task SendRequest(IMessageSession messageSession)
64+
{
65+
var requestId = Guid.NewGuid();
66+
67+
var request = new Request
68+
{
69+
RequestId = requestId
70+
};
71+
Console.WriteLine($"Request sent id: {requestId}");
72+
return messageSession.Send("Samples.Unobtrusive.Server", request);
73+
}
74+
75+
static Task SendCommand(IMessageSession messageSession)
76+
{
77+
var commandId = Guid.NewGuid();
78+
79+
var myCommand = new MyCommand
80+
{
81+
CommandId = commandId,
82+
};
83+
Console.WriteLine($"Command sent id: {commandId}");
84+
return messageSession.Send("Samples.Unobtrusive.Server", myCommand);
85+
}
86+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using Events;
2+
using Microsoft.Extensions.Logging;
3+
4+
public class MyEventHandler(ILogger<MyEventHandler> logger) : IHandleMessages<MyEvent>
5+
{
6+
public Task Handle(MyEvent message, IMessageHandlerContext context)
7+
{
8+
logger.LogInformation("MyEvent received from server with id:{EventId}", message.EventId);
9+
return Task.CompletedTask;
10+
}
11+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Microsoft.Extensions.Hosting;
3+
4+
Console.Title = "Client";
5+
var builder = Host.CreateApplicationBuilder(args);
6+
7+
var endpointConfiguration = new EndpointConfiguration("Samples.Unobtrusive.Client");
8+
endpointConfiguration.UseSerialization<SystemJsonSerializer>();
9+
endpointConfiguration.UseTransport(new LearningTransport());
10+
endpointConfiguration.UseClaimCheck<FileShareClaimCheck, SystemJsonClaimCheckSerializer>()
11+
.BasePath(@"..\..\..\..\ClaimCheckShare\");
12+
13+
endpointConfiguration.ApplyCustomConventions();
14+
15+
builder.UseNServiceBus(endpointConfiguration);
16+
17+
var host = builder.Build();
18+
19+
await host.StartAsync();
20+
21+
var messageSession = host.Services.GetRequiredService<IMessageSession>();
22+
await CommandSender.Start(messageSession);
23+
24+
await host.StopAsync();
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using Messages;
2+
using Microsoft.Extensions.Logging;
3+
4+
public class ResponseHandler(ILogger<ResponseHandler> logger) : IHandleMessages<Response>
5+
{
6+
public Task Handle(Response message, IMessageHandlerContext context)
7+
{
8+
logger.LogInformation("Response received from server for request with id:{ResponseId}", message.ResponseId);
9+
return Task.CompletedTask;
10+
}
11+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using NServiceBus.ClaimCheck;
2+
3+
public static class ConventionExtensions
4+
{
5+
#region CustomConvention
6+
7+
public static void ApplyCustomConventions(this EndpointConfiguration endpointConfiguration)
8+
{
9+
var conventions = endpointConfiguration.Conventions();
10+
11+
conventions.DefiningCommandsAs(
12+
type =>
13+
type.Namespace != null &&
14+
type.Namespace.EndsWith("Commands"));
15+
16+
conventions.DefiningEventsAs(
17+
type =>
18+
type.Namespace != null &&
19+
type.Namespace.EndsWith("Events"));
20+
21+
conventions.DefiningMessagesAs(
22+
type => type.Namespace == "Messages");
23+
24+
conventions.DefiningClaimCheckPropertiesAs(
25+
property => property.Name.EndsWith("ClaimCheck"));
26+
27+
conventions.DefiningTimeToBeReceivedAs(
28+
type =>
29+
{
30+
if (type.Name.EndsWith("Expires"))
31+
{
32+
return TimeSpan.FromSeconds(30);
33+
}
34+
return TimeSpan.MaxValue;
35+
});
36+
}
37+
38+
#endregion
39+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using Events;
2+
3+
class CommandSender
4+
{
5+
public static async Task Start(IMessageSession messageSession)
6+
{
7+
Console.WriteLine("Press 'E' to publish an event");
8+
Console.WriteLine("Press any other key to exit");
9+
10+
while (true)
11+
{
12+
var key = Console.ReadKey();
13+
Console.WriteLine();
14+
15+
switch (key.Key)
16+
{
17+
case ConsoleKey.E:
18+
await PublishEvent(messageSession);
19+
continue;
20+
}
21+
return;
22+
}
23+
}
24+
25+
static Task PublishEvent(IMessageSession messageSession)
26+
{
27+
var eventId = Guid.NewGuid();
28+
29+
Console.WriteLine($"Event published, id: {eventId}");
30+
var myEvent = new MyEvent
31+
{
32+
EventId = eventId
33+
};
34+
return messageSession.Publish(myEvent);
35+
}
36+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using Messages;
2+
using Microsoft.Extensions.Logging;
3+
4+
public class LargeMessageHandler(ILogger<LargeMessageHandler> logger) : IHandleMessages<LargeMessage>
5+
{
6+
public Task Handle(LargeMessage message, IMessageHandlerContext context)
7+
{
8+
if (message.LargeClaimCheck == null)
9+
{
10+
logger.LogInformation("Message [{MessageType}] received, id:{RequestId}", message.GetType(), message.RequestId);
11+
}
12+
else
13+
{
14+
logger.LogInformation("Message [{MessageType}] received, id:{RequestId} and payload {PayloadLength} bytes", message.GetType(), message.RequestId, message.LargeClaimCheck.Length);
15+
}
16+
return Task.CompletedTask;
17+
}
18+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Messages;
2+
using Microsoft.Extensions.Logging;
3+
4+
public class MessageThatExpiresHandler(ILogger<MessageThatExpiresHandler> logger) : IHandleMessages<MessageThatExpires>
5+
{
6+
7+
public Task Handle(MessageThatExpires message, IMessageHandlerContext context)
8+
{
9+
logger.LogInformation("Message [{MessageType}] received, id: [{RequestId}]", message.GetType(), message.RequestId);
10+
return Task.CompletedTask;
11+
}
12+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using Commands;
2+
using Microsoft.Extensions.Logging;
3+
4+
public class MyCommandHandler(ILogger<MyCommandHandler> logger) : IHandleMessages<MyCommand>
5+
{
6+
public Task Handle(MyCommand message, IMessageHandlerContext context)
7+
{
8+
logger.LogInformation("Command received, id:{CommandId}", message.CommandId);
9+
return Task.CompletedTask;
10+
}
11+
}

0 commit comments

Comments
 (0)