Before we get started, we should look at the biggest and baddest main.cs we've done so far. Nothing but the best for our manager, right? Refer to the following code to see what we have done:
static void Main(string[] args)
{
var builder = new ContainerBuilder();
// Service itself
builder.RegisterType<MSBaseLogger>()?.SingleInstance();
builder.RegisterType<MicroServiceManager>()
.AsImplementedInterfaces()
.AsSelf()
?.InstancePerLifetimeScope();
//builder.AttachInterceptorsToRegistrations(new LogInterceptor(Console.Out));
_container = builder.Build();
XmlConfigurator.ConfigureAndWatch(new FileInfo(@".log4net.config"));
HostFactory.Run(c =>
{
c?.UseAutofacContainer(_container);
c?.UseLog4Net();
c?.ApplyCommandLineWithDebuggerSupport();
c?.EnablePauseAndContinue();
c?.EnableShutdown();
c?.OnException(ex => Console.WriteLine(ex.Message));
c?.UseWindowsHostEnvironmentWithDebugSupport();
c?.Service<MicroServiceManager>(s =>
{
s.ConstructUsingAutofacContainer<MicroServiceManager>();
s?.ConstructUsing(settings =>
{
var service = AutofacHostBuilderConfigurator.LifetimeScope.Resolve<MicroServiceManager>();
return service;
});
s?.ConstructUsing(name => new MicroServiceManager(_container, Guid.NewGuid().ToString()));
s?.WhenStartedAsLeader(b =>
{
b.WhenStarted(async (service, token) =>
{
await service.Start(token);
});
b.Lease(lcb => lcb.RenewLeaseEvery(TimeSpan.FromSeconds(2))
.AquireLeaseEvery(TimeSpan.FromSeconds(5))
.LeaseLength(TimeSpan.FromDays(1))
.WithLeaseManager(new MicroServiceManager()));
b.WithHeartBeat(TimeSpan.FromSeconds(30), (isLeader, token) => Task.CompletedTask);
b.Build();
});
s?.WhenStarted((MicroServiceManager server, HostControl host) => server.OnStart(host));
s?.WhenPaused(server => server?.OnPause());
s?.WhenContinued(server => server?.OnResume());
s?.WhenStopped(server => server?.OnStop());
s?.WhenShutdown(server => server?.OnShutdown());
s?.WhenCustomCommandReceived((server, host, code) => { });
s?.AfterStartingService(() => { });
s?.AfterStoppingService(() => { });
s?.BeforeStartingService(() => { });
s?.BeforeStoppingService(() => { });
});
c?.RunAsNetworkService();
c?.StartAutomaticallyDelayed();
c?.SetDescription(string.Intern("MicroService Manager Sample"));
c?.SetDisplayName(string.Intern("MicroServiceManager"));
c?.SetServiceName(string.Intern("MicroServiceManager"));
c?.EnableServiceRecovery(r =>
{
r?.OnCrashOnly();
r?.RestartService(1); //first
r?.RestartService(1); //second
r?.RestartService(1); //subsequents
r?.SetResetPeriod(0);
});
});
}