Code walk-through
This sample illustrates the order of startup and shutdown operations including all extension points that plug into that process. All interfaces that extend the startup and shutdown are included in an ExtensionPoints
directory.
Logger
At each step in the process a line is written to both the console and a text file via a logger.
static class Logger
{
static ILog log = LogManager.GetLogger(typeof(Logger));
public static string OutputFilePath;
static object locker = new object();
static Logger()
{
OutputFilePath = Path.GetFullPath(@"..\StartupShutdownSequence.txt");
AppDomain.CurrentDomain.ProcessExit += Exit;
File.Delete(OutputFilePath);
File.AppendAllText(OutputFilePath, "startcode");
File.AppendAllText(OutputFilePath, " StartupShutdownSequence\r\n");
}
static void Exit(object sender, EventArgs e)
{
File.AppendAllText(OutputFilePath, "endcode");
}
public static void WriteLine(string message)
{
message = $"Thread:{Thread.CurrentThread.ManagedThreadId} {message}\r\n";
log.Info(message);
lock (locker)
{
File.AppendAllText(OutputFilePath, message);
}
}
}
Console program
The main section of the console Program
configures and starts the endpoint while logging all these actions.
Logger.WriteLine("Starting configuration");
var endpointConfiguration = new EndpointConfiguration("Samples.StartupShutdown");
endpointConfiguration.EnableInstallers();
endpointConfiguration.EnableFeature<MyFeature>();
endpointConfiguration.UsePersistence<LearningPersistence>();
endpointConfiguration.UseTransport<LearningTransport>();
Logger.WriteLine("Calling Endpoint.Start");
var endpointInstance = await Endpoint.Start(endpointConfiguration)
.ConfigureAwait(false);
// simulate some activity
await Task.Delay(500)
.ConfigureAwait(false);
Logger.WriteLine("Endpoint is processing messages");
Logger.WriteLine("Calling IEndpointInstance.Stop");
await endpointInstance.Stop()
.ConfigureAwait(false);
Logger.WriteLine("Finished");
The resulting order
In some versions of NServiceBus, certain extension points are executed on separate threads.
Thread:1 Starting configuration
Thread:1 Calling Endpoint.Start
Thread:1 Inside INeedInitialization.Customize
Thread:1 Inside WantToRunBeforeConfigurationIsFinalized.Run
Thread:1 Inside Feature.Setup
Thread:1 Inside INeedToInstallSomething.Install
Thread:1 Inside FeatureStartupTask.OnStart
Thread:5 Endpoint is processing messages
Thread:5 Calling IEndpointInstance.Stop
Thread:5 Inside FeatureStartupTask.OnStop
Thread:5 Finished