From 9db8db89bc15233f3c0a28ceabe014856bdc447c Mon Sep 17 00:00:00 2001
From: "dependencyupdates[bot]"
<218638057+dependencyupdates[bot]@users.noreply.github.com>
Date: Wed, 11 Mar 2026 05:31:22 +0000
Subject: [PATCH 1/2] Update dependency System.CommandLine to 2.0.4
---
.../ServiceControl.Connector.MassTransit.Host.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ServiceControl.Connector.MassTransit.Host/ServiceControl.Connector.MassTransit.Host.csproj b/src/ServiceControl.Connector.MassTransit.Host/ServiceControl.Connector.MassTransit.Host.csproj
index a1c1076..d4999f6 100644
--- a/src/ServiceControl.Connector.MassTransit.Host/ServiceControl.Connector.MassTransit.Host.csproj
+++ b/src/ServiceControl.Connector.MassTransit.Host/ServiceControl.Connector.MassTransit.Host.csproj
@@ -17,7 +17,7 @@
-
+
From 8448660591b2fdcf8603acefea9129e188c1ab9a Mon Sep 17 00:00:00 2001
From: Daniel Marbach
Date: Wed, 11 Mar 2026 08:40:07 +0100
Subject: [PATCH 2/2] Adjust code and also make sure the builder is properly
disposed
---
.../Commands/ConnectorCommandOptions.cs | 101 ++++++++++--------
.../Commands/HealthCheckCommand.cs | 13 +--
.../Commands/QueuesCommand.cs | 23 ++--
.../Commands/StartupCommand.cs | 40 +++----
.../Program.cs | 25 ++---
5 files changed, 100 insertions(+), 102 deletions(-)
diff --git a/src/ServiceControl.Connector.MassTransit.Host/Commands/ConnectorCommandOptions.cs b/src/ServiceControl.Connector.MassTransit.Host/Commands/ConnectorCommandOptions.cs
index a4c6e03..912a076 100644
--- a/src/ServiceControl.Connector.MassTransit.Host/Commands/ConnectorCommandOptions.cs
+++ b/src/ServiceControl.Connector.MassTransit.Host/Commands/ConnectorCommandOptions.cs
@@ -1,62 +1,71 @@
namespace ServiceControl.Connector.MassTransit.Host.Commands;
using System.CommandLine;
-using System.CommandLine.Parsing;
public static class ConnectorCommandOptions
{
- static Option ConnectionString { get; } = new(
- "--connection-string",
- "The connection string for the transport. Can also be set via CONNECTION_STRING environment variable.");
+ static Option ConnectionString { get; } = new("--connection-string")
+ {
+ Description = "The connection string for the transport. Can also be set via CONNECTION_STRING environment variable."
+ };
- static Option TransportType { get; } = new(
- "--transport-type",
- "The transport type (AzureServiceBus, AzureServiceBusWithDeadLetter, RabbitMQ, AmazonSQS). Can also be set via TRANSPORT_TYPE environment variable.");
+ static Option TransportType { get; } = new("--transport-type")
+ {
+ Description = "The transport type (AzureServiceBus, AzureServiceBusWithDeadLetter, RabbitMQ, AmazonSQS). Can also be set via TRANSPORT_TYPE environment variable."
+ };
- static Option QueuesFile { get; } = new(
- "--queues-file",
- "Path to the file containing the list of queues to monitor. Can also be set via QUEUES_FILE environment variable.");
+ static Option QueuesFile { get; } = new("--queues-file")
+ {
+ Description = "Path to the file containing the list of queues to monitor. Can also be set via QUEUES_FILE environment variable."
+ };
- static Option ReturnQueue { get; } = new(
- "--return-queue",
- "The return queue name. Defaults to 'Particular.ServiceControl.Connector.MassTransit_return'. Can also be set via RETURN_QUEUE environment variable.");
+ static Option ReturnQueue { get; } = new("--return-queue")
+ {
+ Description = "The return queue name. Defaults to 'Particular.ServiceControl.Connector.MassTransit_return'. Can also be set via RETURN_QUEUE environment variable."
+ };
- static Option ErrorQueue { get; } = new(
- "--error-queue",
- "The error queue name. Defaults to 'error'. Can also be set via ERROR_QUEUE environment variable.");
+ static Option ErrorQueue { get; } = new("--error-queue")
+ {
+ Description = "The error queue name. Defaults to 'error'. Can also be set via ERROR_QUEUE environment variable."
+ };
- static Option ServiceControlQueue { get; } = new(
- "--servicecontrol-queue",
- "The ServiceControl queue name. Defaults to 'Particular.ServiceControl'. Can also be set via SERVICECONTROL_QUEUE environment variable.");
+ static Option ServiceControlQueue { get; } = new("--servicecontrol-queue")
+ {
+ Description = "The ServiceControl queue name. Defaults to 'Particular.ServiceControl'. Can also be set via SERVICECONTROL_QUEUE environment variable."
+ };
- static Option RabbitMqManagementApiUrl { get; } = new(
- "--rabbitmq-management-api-url",
- "The RabbitMQ management API URL (required for RabbitMQ transport). Can also be set via RABBITMQ_MANAGEMENT_API_URL environment variable.");
+ static Option RabbitMqManagementApiUrl { get; } = new("--rabbitmq-management-api-url")
+ {
+ Description = "The RabbitMQ management API URL (required for RabbitMQ transport). Can also be set via RABBITMQ_MANAGEMENT_API_URL environment variable."
+ };
- static Option RabbitMqManagementApiUsername { get; } = new(
- "--rabbitmq-management-api-username",
- "The RabbitMQ management API username. Can also be set via RABBITMQ_MANAGEMENT_API_USERNAME environment variable.");
+ static Option RabbitMqManagementApiUsername { get; } = new("--rabbitmq-management-api-username")
+ {
+ Description = "The RabbitMQ management API username. Can also be set via RABBITMQ_MANAGEMENT_API_USERNAME environment variable."
+ };
- static Option RabbitMqManagementApiPassword { get; } = new(
- "--rabbitmq-management-api-password",
- "The RabbitMQ management API password. Can also be set via RABBITMQ_MANAGEMENT_API_PASSWORD environment variable.");
+ static Option RabbitMqManagementApiPassword { get; } = new("--rabbitmq-management-api-password")
+ {
+ Description = "The RabbitMQ management API password. Can also be set via RABBITMQ_MANAGEMENT_API_PASSWORD environment variable."
+ };
- static Option RabbitMqQueueType { get; } = new(
- "--rabbitmq-queue-type",
- "The RabbitMQ queue type (Classic or Quorum). Defaults to Quorum. Can also be set via RABBITMQ_QUEUE_TYPE environment variable.");
+ static Option RabbitMqQueueType { get; } = new("--rabbitmq-queue-type")
+ {
+ Description = "The RabbitMQ queue type (Classic or Quorum). Defaults to Quorum. Can also be set via RABBITMQ_QUEUE_TYPE environment variable."
+ };
public static void AddConnectorOptions(this Command command)
{
- command.AddOption(ConnectionString);
- command.AddOption(TransportType);
- command.AddOption(QueuesFile);
- command.AddOption(ReturnQueue);
- command.AddOption(ErrorQueue);
- command.AddOption(ServiceControlQueue);
- command.AddOption(RabbitMqManagementApiUrl);
- command.AddOption(RabbitMqManagementApiUsername);
- command.AddOption(RabbitMqManagementApiPassword);
- command.AddOption(RabbitMqQueueType);
+ command.Add(ConnectionString);
+ command.Add(TransportType);
+ command.Add(QueuesFile);
+ command.Add(ReturnQueue);
+ command.Add(ErrorQueue);
+ command.Add(ServiceControlQueue);
+ command.Add(RabbitMqManagementApiUrl);
+ command.Add(RabbitMqManagementApiUsername);
+ command.Add(RabbitMqManagementApiPassword);
+ command.Add(RabbitMqQueueType);
}
public static string[] BuildArgs(ParseResult parseResult)
@@ -80,16 +89,16 @@ void AddArgIfExplicit(Option option, string configKey)
{
// Only forward options that the user explicitly provided on the command line.
// Omitting defaults lets environment variables take effect through normal config precedence.
- if (parseResult.FindResultFor(option) == null)
+ var token = parseResult.GetValue(option);
+ if (token == null)
{
return;
}
- var value = parseResult.GetValueForOption(option);
- if (!string.IsNullOrEmpty(value))
+ if (!string.IsNullOrEmpty(token))
{
- args.Add($"--{configKey}={value}");
+ args.Add($"--{configKey}={token}");
}
}
}
-}
+}
\ No newline at end of file
diff --git a/src/ServiceControl.Connector.MassTransit.Host/Commands/HealthCheckCommand.cs b/src/ServiceControl.Connector.MassTransit.Host/Commands/HealthCheckCommand.cs
index fbfbdfe..ce1ef00 100644
--- a/src/ServiceControl.Connector.MassTransit.Host/Commands/HealthCheckCommand.cs
+++ b/src/ServiceControl.Connector.MassTransit.Host/Commands/HealthCheckCommand.cs
@@ -1,7 +1,6 @@
namespace ServiceControl.Connector.MassTransit.Host.Commands;
using System.CommandLine;
-using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
@@ -11,22 +10,20 @@ public HealthCheckCommand() : base("health-check", "Performs a validation that t
{
this.AddConnectorOptions();
- this.SetHandler(async context =>
+ SetAction(async (parseResult, cancellationToken) =>
{
- var connectorArgs = ConnectorCommandOptions.BuildArgs(context.ParseResult);
+ var connectorArgs = ConnectorCommandOptions.BuildArgs(parseResult);
- context.ExitCode = await InternalHandler(connectorArgs, context.GetCancellationToken());
+ return await InternalHandler(connectorArgs, cancellationToken);
});
}
async Task InternalHandler(string[] connectorArgs, CancellationToken cancellationToken)
{
- var builder = Host.CreateEmptyApplicationBuilder(null);
- builder.Configuration.AddEnvironmentVariables();
- builder.Configuration.AddCommandLine(connectorArgs);
+ var builder = Host.CreateApplicationBuilder(connectorArgs);
builder.UseMassTransitConnector(true);
- var host = builder.Build();
+ using var host = builder.Build();
var queueInformationProvider = host.Services.GetRequiredService();
var (success, errorMessage) = await queueInformationProvider.TryCheck(cancellationToken);
diff --git a/src/ServiceControl.Connector.MassTransit.Host/Commands/QueuesCommand.cs b/src/ServiceControl.Connector.MassTransit.Host/Commands/QueuesCommand.cs
index 30073f0..7e12825 100644
--- a/src/ServiceControl.Connector.MassTransit.Host/Commands/QueuesCommand.cs
+++ b/src/ServiceControl.Connector.MassTransit.Host/Commands/QueuesCommand.cs
@@ -2,7 +2,6 @@ namespace ServiceControl.Connector.MassTransit.Host.Commands;
using System.CommandLine;
using System.Text.RegularExpressions;
-using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
@@ -10,28 +9,30 @@ public class QueuesCommand : Command
{
public QueuesCommand() : base("queues-list", "List queues")
{
- var filterOption = new Option("--filter", () => ".*_error$", "Use a regex to filter queues by name.");
- AddOption(filterOption);
+ var filterOption = new Option("--filter")
+ {
+ DefaultValueFactory = _ => ".*_error$",
+ Description = "Use a regex to filter queues by name.",
+ };
+ Add(filterOption);
this.AddConnectorOptions();
- this.SetHandler(async context =>
+ SetAction(async (parseResult, cancellationToken) =>
{
- var filter = context.ParseResult.GetValueForOption(filterOption);
- var connectorArgs = ConnectorCommandOptions.BuildArgs(context.ParseResult);
+ var filter = parseResult.GetValue(filterOption);
+ var connectorArgs = ConnectorCommandOptions.BuildArgs(parseResult);
- context.ExitCode = await InternalHandler(filter!, connectorArgs, context.GetCancellationToken());
+ return await InternalHandler(filter!, connectorArgs, cancellationToken);
});
}
async Task InternalHandler(string filter, string[] connectorArgs, CancellationToken cancellationToken)
{
- var builder = Host.CreateEmptyApplicationBuilder(null);
- builder.Configuration.AddEnvironmentVariables();
- builder.Configuration.AddCommandLine(connectorArgs);
+ var builder = Host.CreateApplicationBuilder(connectorArgs);
builder.UseMassTransitConnector(true);
- var host = builder.Build();
+ using var host = builder.Build();
var queueInformationProvider = host.Services.GetRequiredService();
var queues = queueInformationProvider.GetQueues(cancellationToken);
diff --git a/src/ServiceControl.Connector.MassTransit.Host/Commands/StartupCommand.cs b/src/ServiceControl.Connector.MassTransit.Host/Commands/StartupCommand.cs
index 3cf1da6..90ad40b 100644
--- a/src/ServiceControl.Connector.MassTransit.Host/Commands/StartupCommand.cs
+++ b/src/ServiceControl.Connector.MassTransit.Host/Commands/StartupCommand.cs
@@ -11,28 +11,30 @@ public class StartupCommand : RootCommand
{
public StartupCommand(string[] args) : base("Particular Software ServiceControl Masstransit Connector")
{
- var consoleOption = new Option(
- "--console",
- "Run in console mode.");
- consoleOption.AddAlias("-c");
-
- var runModeOption = new Option(
- "--run-mode",
- () => RunMode.SetupAndRun,
- "Mode to run in.")
- { Arity = ArgumentArity.ExactlyOne };
-
- AddOption(consoleOption);
- AddOption(runModeOption);
- this.AddConnectorOptions();
+ var consoleOption = new Option("--console")
+ {
+ Aliases = { "-c" },
+ Description = "Run in console mode."
+ };
+
+ var runModeOption = new Option("--run-mode")
+ {
+ Description = "Mode to run in.",
+ Arity = ArgumentArity.ExactlyOne,
+ DefaultValueFactory = _ => RunMode.SetupAndRun,
+ };
+
+ Add(consoleOption);
+ Add(runModeOption);
- this.SetHandler(async context =>
+ this.AddConnectorOptions();
+ SetAction(async (parseResult, cancellationToken) =>
{
- var isConsole = context.ParseResult.GetValueForOption(consoleOption);
- var runMode = context.ParseResult.GetValueForOption(runModeOption);
- var connectorArgs = ConnectorCommandOptions.BuildArgs(context.ParseResult);
+ var isConsole = parseResult.GetValue(consoleOption);
+ var runMode = parseResult.GetValue(runModeOption);
+ var connectorArgs = ConnectorCommandOptions.BuildArgs(parseResult);
- context.ExitCode = await InternalHandler(runMode, isConsole, connectorArgs, context.GetCancellationToken());
+ return await InternalHandler(runMode, isConsole, connectorArgs, cancellationToken);
});
}
diff --git a/src/ServiceControl.Connector.MassTransit.Host/Program.cs b/src/ServiceControl.Connector.MassTransit.Host/Program.cs
index 60b0f00..8b5b8c5 100644
--- a/src/ServiceControl.Connector.MassTransit.Host/Program.cs
+++ b/src/ServiceControl.Connector.MassTransit.Host/Program.cs
@@ -1,21 +1,10 @@
-using System.CommandLine.Builder;
-using System.CommandLine.Parsing;
using ServiceControl.Connector.MassTransit.Host.Commands;
-var startupCommand = new StartupCommand(args);
+StartupCommand startupCommand = new(args)
+{
+ new QueuesCommand(),
+ new HealthCheckCommand()
+};
-startupCommand.AddCommand(new QueuesCommand());
-startupCommand.AddCommand(new HealthCheckCommand());
-
-var commandLineBuilder = new CommandLineBuilder(startupCommand);
-
-commandLineBuilder
- .UseVersionOption()
- .UseHelp()
- .UseTypoCorrections()
- .UseParseErrorReporting()
- .UseExceptionHandler()
- .CancelOnProcessTermination();
-
-var parser = commandLineBuilder.Build();
-return await parser.InvokeAsync(args);
+var exitCode = await startupCommand.Parse(args).InvokeAsync();
+return exitCode;