1

I'm trying to trigger an event every 10 seconds in windows service using TopShelf and FluentScheduler in .Net but i'm not just getting my event triggered every 10 seconds. I'm sharing my implementation, kindly guide me.

class Program
    {        
        static void Main(string[] args)
        {
            HostFactory.Run(x =>
            {
                x.Service<IWindowsService>(s =>
                {
                    s.ConstructUsing(name => new WindowsService(new SchedulerRegistry(new Worker())));
                    s.WhenStarted(tc => tc.Start());
                    s.WhenStopped(tc => tc.Stop());
                });

                x.RunAsLocalSystem();

                x.SetDescription("Test");
                x.SetDisplayName("Test Service");
                x.SetServiceName("Testservice");

                x.StartAutomatically();

                x.EnableServiceRecovery(s =>
                {
                    s.RestartService(1);
                    s.RestartService(2);
                });
            });
        }
    }

    public class SchedulerRegistry : Registry
    {
        public SchedulerRegistry(Worker worker)
        {
            Schedule(() =>
            {
                try
                {
                    worker.Run();
                }
                catch (Exception ex)
                {

                    throw;
                }
            }).NonReentrant().ToRunNow().AndEvery(10).Seconds();
        }
    }

    public interface IWindowsService
    {
        void Start();
        void Stop();
    }

    public class WindowsService : IWindowsService
    {
        public WindowsService(SchedulerRegistry registry)
        {
            JobManager.Initialize(registry);
        }

        public void Start()
        {
            Console.WriteLine("Service started");
        }

        public void Stop()
        {
            Console.WriteLine("Service stopped");
        }
    }

    public class Worker
    {
        public void Run()
        {
            CheckUrl();
        }

        public static void CheckUrl()
        {
            HttpWebResponse response = null;

            try
            {
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://google.com");
                request.Method = "GET";

                response = (HttpWebResponse)request.GetResponse();

                if (response.StatusCode == HttpStatusCode.OK)
                {
                }
                else
                {
                }
            }
            catch (WebException e)
            {
                response.Close();
            }
            finally
            {
                if (response != null)
                {
                    response.Close();
                }
            }
        }

    }
DevWithSigns
  • 725
  • 16
  • 33

1 Answers1

0

I was able to get it to run by doing the following:

public class WindowsService : IWindowsService
{
    private SchedulerRegistry registry;

    public WindowsService(SchedulerRegistry schedulerRegistry)
    {
        this.registry = schedulerRegistry;  
    }

    public void Start()
    {
        Console.WriteLine("Service started");

        JobManager.Initialize(this.registry);
    }

    public void Stop()
    {
        Console.WriteLine("Service stopped");
    }
}

Basically all I did was to change where the JobManager.Initialize(this.registry) was being called. I don't think you want it to run until your service starts anyway so I think this makes sense.

Cole W
  • 15,123
  • 6
  • 51
  • 85