Skip to content

Commit eac3074

Browse files
committed
feat: more flat config
1 parent 20b3e7a commit eac3074

File tree

15 files changed

+115
-138
lines changed

15 files changed

+115
-138
lines changed

.config/dotnet-tools.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@
33
"isRoot": true,
44
"tools": {
55
"dotnet-sonarscanner": {
6-
"version": "6.2.0",
6+
"version": "10.1.2",
77
"commands": [
88
"dotnet-sonarscanner"
9-
]
9+
],
10+
"rollForward": false
1011
},
1112
"gitversion.tool": {
12-
"version": "5.12.0",
13+
"version": "6.3.0",
1314
"commands": [
1415
"dotnet-gitversion"
15-
]
16+
],
17+
"rollForward": false
1618
}
1719
}
1820
}

examples/BackgroundQueueApp/BackgroundQueueApp.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
<Project Sdk="Microsoft.NET.Sdk.Web">
22

33
<PropertyGroup>
4-
<TargetFramework>net8</TargetFramework>
4+
<TargetFramework>net9</TargetFramework>
55
</PropertyGroup>
66

77
<ItemGroup>
88
<AssemblyAttribute Include="System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute" />
99
</ItemGroup>
1010

1111
<ItemGroup>
12-
<PackageReference Include="Swashbuckle.AspNetCore" Version="7.*" />
12+
<PackageReference Include="Swashbuckle.AspNetCore" Version="8.*" />
1313
</ItemGroup>
1414

1515
<ItemGroup>

examples/BackgroundQueueApp/Program.cs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
var builder = WebApplication.CreateBuilder(args);
1010

11+
#region Background queues setup
12+
1113
// See https://github.com/App-vNext/Polly/blob/main/docs/migration-v8.md
1214
var resiliencePipeline = new ResiliencePipelineBuilder()
1315
.AddRetry(new RetryStrategyOptions
@@ -21,19 +23,19 @@
2123
.Build();
2224

2325
// A background queue with an inline handler
24-
builder.Services.AddBackgroundQueues(bq =>
25-
bq.AddQueue(HandlerStack.For<WeatherForecast>(async (weather, ct) =>
26-
{
27-
await Task.Delay(TimeSpan.FromSeconds(2), ct);
28-
Console.WriteLine(weather.Summary);
29-
})
30-
.UseMessagePayload()
31-
.Scoped()
32-
.Trace()
33-
.UsePollyPipeline(resiliencePipeline)
34-
.LogExceptions()
35-
)
36-
);
26+
var bq = builder.Services.AddBackgroundQueues();
27+
bq.AddQueue(HandlerStack.For<WeatherForecast>(async (weather, ct) =>
28+
{
29+
await Task.Delay(TimeSpan.FromSeconds(2), ct);
30+
Console.WriteLine(weather.Summary);
31+
})
32+
.UseMessagePayload()
33+
.Scoped()
34+
.Trace()
35+
.UsePollyPipeline(resiliencePipeline)
36+
.LogExceptions());
37+
38+
#endregion
3739

3840
builder.Services.AddControllers();
3941
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle

examples/BackgroundQueueApp/appsettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{
1+
{
22
"Logging": {
33
"LogLevel": {
44
"Default": "Information",

examples/KafkaConsumerApp/KafkaConsumerApp.csproj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
<Project Sdk="Microsoft.NET.Sdk.Worker">
22

33
<PropertyGroup>
4-
<TargetFramework>net8</TargetFramework>
4+
<TargetFramework>net9</TargetFramework>
55
</PropertyGroup>
66

77
<ItemGroup>
88
<AssemblyAttribute Include="System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute" />
99
</ItemGroup>
1010

1111
<ItemGroup>
12+
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.*" />
13+
1214
<PackageReference Include="Confluent.Kafka" Version="2.*" />
1315
<PackageReference Include="Confluent.SchemaRegistry" Version="2.*" />
1416
<PackageReference Include="Confluent.SchemaRegistry.Serdes.Protobuf" Version="2.*" />
1517
<!-- protoc compiler -->
1618
<PackageReference Include="Grpc.Tools" Version="2.*" />
17-
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.*" />
1819
</ItemGroup>
1920

2021
<ItemGroup>

examples/KafkaConsumerApp/Program.cs

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,31 +13,29 @@
1313
options.ServicesStopConcurrently = true;
1414
});
1515

16-
builder.Services
16+
var kafka = builder.Services
1717
.AddScoped<MessageHandler>()
18-
.AddKafkaConsumers(kafka =>
18+
.AddKafkaConsumers();
19+
kafka.Defaults
20+
.Bind(builder.Configuration.GetSection("Kafka"))
21+
.ValidateDataAnnotations();
22+
kafka.AddConsumer("example-consumer-group",
23+
HandlerStack.From<MessageHandler, WeatherForecast>()
24+
.Scoped()
25+
.UseKafkaPayload()
26+
.Deserialize(context => JsonSerializer.Deserialize<WeatherForecast>(context.Payload)!)
27+
.Trace()
28+
// .Acknowledge()
29+
.LogExceptions()
30+
)
31+
.Bind(builder.Configuration.GetSection("Kafka:Consumer"))
32+
.Configure(options =>
1933
{
20-
kafka.Defaults
21-
.Bind(builder.Configuration.GetSection("Kafka"))
22-
.ValidateDataAnnotations();
23-
kafka.AddConsumer("example-consumer-group",
24-
HandlerStack.From<MessageHandler, WeatherForecast>()
25-
.Scoped()
26-
.UseKafkaPayload()
27-
.Deserialize(context => JsonSerializer.Deserialize<WeatherForecast>(context.Payload)!)
28-
.Trace()
29-
// .Acknowledge()
30-
.LogExceptions()
31-
)
32-
.Bind(builder.Configuration.GetSection("Kafka:Consumer"))
33-
.Configure(options =>
34-
{
35-
options.ClientConfig.AutoOffsetReset = AutoOffsetReset.Earliest;
36-
// options.ClientConfig.EnableAutoCommit = false; // DryRun
37-
// options.ClientConfig.EnableAutoOffsetStore = false; // Manually acknowledge every message
38-
})
39-
.ValidateDataAnnotations();
40-
});
34+
options.ClientConfig.AutoOffsetReset = AutoOffsetReset.Earliest;
35+
// options.ClientConfig.EnableAutoCommit = false; // DryRun
36+
// options.ClientConfig.EnableAutoOffsetStore = false; // Manually acknowledge every message
37+
})
38+
.ValidateDataAnnotations();
4139

4240
await builder.Build().RunAsync();
4341

examples/SqsConsumerApp/Program.cs

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,17 @@
1111

1212
var builder = Host.CreateApplicationBuilder(args);
1313

14+
#region Generic configuration
15+
1416
builder.Services
1517
.AddSerilog() // See https://nblumhardt.com/2024/04/serilog-net8-0-minimal/#hooking-up-aspnet-core-and-iloggert
16-
.AddDefaultAWSOptions(builder.Configuration.GetAWSOptions())
17-
.AddAWSService<IAmazonSQS>();
18+
.Configure<HostOptions>(options =>
19+
{
20+
options.ServicesStartConcurrently = true;
21+
options.ServicesStopConcurrently = true;
22+
});
1823

19-
builder.Services.Configure<HostOptions>(options =>
20-
{
21-
options.ServicesStartConcurrently = true;
22-
options.ServicesStopConcurrently = true;
23-
});
24+
#endregion
2425

2526
#region OpenTelemetry
2627

@@ -44,22 +45,26 @@
4445

4546
#endregion
4647

48+
#region SQS consumers setup
49+
4750
builder.Services
48-
.AddScoped<MessageHandler>()
49-
.AddSqsConsumers(sqs =>
50-
{
51-
sqs.Defaults.Configure(options => options.MaxNumberOfMessages = 1);
52-
sqs.AddConsumer("weather-forecasts", // Also acts as a queue name
53-
HandlerStack.From<MessageHandler, WeatherForecast>()
54-
.Scoped()
55-
.UseSqsPayload()
56-
.DeserializeJson()
57-
.Trace()
58-
.Acknowledge() // Do not include DeleteMessage call in the OpenTelemetry root span (transaction)
59-
.LogFingersCrossed()
60-
.LogExceptions()
61-
);
62-
});
51+
.AddDefaultAWSOptions(builder.Configuration.GetAWSOptions())
52+
.AddAWSService<IAmazonSQS>()
53+
.AddScoped<MessageHandler>();
54+
var sqs = builder.Services.AddSqsConsumers();
55+
sqs.Defaults.Configure(options => options.MaxNumberOfMessages = 1);
56+
sqs.AddConsumer("weather-forecasts", // Also acts as a queue name
57+
HandlerStack.From<MessageHandler, WeatherForecast>()
58+
.Scoped()
59+
.UseSqsPayload()
60+
.DeserializeJson()
61+
.Trace()
62+
.Acknowledge() // Do not include DeleteMessage call in the OpenTelemetry root span (transaction)
63+
.LogFingersCrossed()
64+
.LogExceptions()
65+
);
66+
67+
#endregion
6368

6469
await builder.Build().RunAsync();
6570

examples/SqsConsumerApp/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
`docker compose up -d` to spin up the localstack & Aspire containers.
88

9+
And access Aspire at [http://localhost:18888](http://localhost:18888).
10+
911
### SQS queue
1012

1113
```shell

examples/SqsConsumerApp/SqsConsumerApp.csproj

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk.Worker">
22

33
<PropertyGroup>
4-
<TargetFramework>net8</TargetFramework>
4+
<TargetFramework>net9</TargetFramework>
55

66
<NoWarn>CA1050</NoWarn>
77
</PropertyGroup>
@@ -11,15 +11,17 @@
1111
</ItemGroup>
1212

1313
<ItemGroup>
14-
<PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.*" />
15-
<PackageReference Include="AWSSDK.SecurityToken" Version="3.*" />
16-
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.*" />
14+
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.*" />
15+
1716
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.*" />
1817
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.*" />
19-
<PackageReference Include="OpenTelemetry.Instrumentation.AWS" Version="1.10.0-rc.2" />
18+
<PackageReference Include="OpenTelemetry.Instrumentation.AWS" Version="1.*" />
2019
<PackageReference Include="Serilog" Version="4.*" />
2120
<PackageReference Include="Serilog.Extensions.Hosting" Version="8.*" />
2221
<PackageReference Include="Serilog.Sinks.FingersCrossed" Version="1.*" />
22+
23+
<PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.*" />
24+
<PackageReference Include="AWSSDK.SecurityToken" Version="3.*" />
2325
</ItemGroup>
2426

2527
<ItemGroup>

src/LocalPost.KafkaConsumer/DependencyInjection/ServiceCollectionEx.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,5 @@ namespace LocalPost.KafkaConsumer.DependencyInjection;
55
[PublicAPI]
66
public static class ServiceCollectionEx
77
{
8-
public static IServiceCollection AddKafkaConsumers(this IServiceCollection services, Action<KafkaBuilder> configure)
9-
{
10-
configure(new KafkaBuilder(services));
11-
12-
return services;
13-
}
8+
public static KafkaBuilder AddKafkaConsumers(this IServiceCollection services) => new(services);
149
}

0 commit comments

Comments
 (0)