Single command line parameter to control Topshelf windows service

点点圈 提交于 2019-12-10 13:54:56

问题


I've made a topshelf windows service that starts three tasks. But since it might happen that one of those task might crash (yes, I know about EnableServiceRecovery), it would be better to use one program to create 3 services with different names and install them using command line parameters.

So in theory the code would look like:

static void Main(string[] args)
{    
    // *********************Below is a TopShelf code*****************************//
    HostFactory.Run(hostConfigurator =>
    {
        hostConfigurator.Service<MyService>(serviceConfigurator =>
        {
            serviceConfigurator.ConstructUsing(() => new MyService(args[0])); //what service we are using
            serviceConfigurator.WhenStarted(myService => myService.Start()); //what to run on start    
            serviceConfigurator.WhenStopped(myService => myService.Stop()); // and on stop   
        });

        hostConfigurator.RunAsLocalSystem();

        //****************Change those names for other services*******************************************//

        hostConfigurator.SetDisplayName("CallForwardService"+args[0]);
        hostConfigurator.SetDescription("CallForward using Topshelf"+args[0]);
        hostConfigurator.SetServiceName("CallForwardService"+args[0]);
        hostConfigurator.SetInstanceName(args[0]);
    });
}

But of course it won't, because (from what I've read) you can't simply use args[] but apparently you can use something like

Callforward.exe install --servicename:CallForward --instancename:Workshop

I'm still not sure how to pass the parameter to be used later in the program (in example above you can see it in new MyService(args[0]) ) - which would be my question number 1. Question number two (as in the title) would be "can I use single parameter to set up all three elements (name, instance and internal use)?

EDIT: SOLVED using help from this answer

string department = null;
// *********************Below is a TopShelf code*****************************//
HostFactory.Run(hostConfigurator =>
{
    hostConfigurator.AddCommandLineDefinition("department", f => { department = f; });
    hostConfigurator.ApplyCommandLine();

    hostConfigurator.Service<MyService>(serviceConfigurator =>
    {
        serviceConfigurator.ConstructUsing(() => new MyService(department)); //what service we are using
        serviceConfigurator.WhenStarted(myService => myService.Start()); //what to run on start    
        serviceConfigurator.WhenStopped(myService => myService.Stop()); // and on stop   
    });

    hostConfigurator.EnableServiceRecovery(r => //What to do when service crashes
    {
        r.RestartService(0); //First, second and consecutive times
        r.RestartService(1);
        r.RestartService(1);

        r.SetResetPeriod(1); //Reset counter after 1 day
    });

    hostConfigurator.RunAsLocalSystem();

    //****************Change those names for other services*******************************************//
    string d = "CallForwardService_" + department;

    hostConfigurator.SetDisplayName(d);
    hostConfigurator.SetDescription("CallForward using Topshelf");
    hostConfigurator.SetServiceName(d);
});

I guess sometimes I have to post things on the forum and then-re read them again to fully understand my own problem.

来源:https://stackoverflow.com/questions/29638241/single-command-line-parameter-to-control-topshelf-windows-service

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!