Использование Quartz.Net, встроенного в службу Windows - PullRequest
2 голосов
/ 19 мая 2011

Я пытаюсь использовать Quartz.Net для планирования заданий внутри службы Windows, которую я разработал.

Я включил следующий код в метод Onstart , планировщик является атрибутом класса private readonly IScheduler scheduler;

logger = LogManager.GetLogger(typeof (TelegestionService));<br /> scheduler = new StdSchedulerFactory().GetScheduler();<br /> var job = new JobDetail("job1", "group1", typeof (HelloJob));<br /> var trigger = new SimpleTrigger("trigger1", "group1", runTime);<br /> scheduler.ScheduleJob(job, trigger);

Это прекрасно работает для меня.Я выполнил задание.

Теперь я пытаюсь сделать встроенный планировщик удаленно доступным, на основе en Example12 в Примерах исходного кода Quartz (Консольный сервер / клиент работает нормально).

var properties = new NameValueCollection();<br /> properties["quartz.scheduler.instanceName"] = "RemoteServer";<br /> properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";<br /> properties["quartz.threadPool.threadCount"] = "5";<br /> properties["quartz.threadPool.threadPriority"] = "Normal";<br /> properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";<br /> properties["quartz.scheduler.exporter.port"] = "555";<br /> properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";<br /> properties["quartz.scheduler.exporter.channelType"] = "tcp";<br /><br /> scheduler = new StdSchedulerFactory(properties).GetScheduler();<br />

Служба запускается правильно, как и планировщик, но я не могу удаленно планировать задание с помощью клиента консоли / Winform (соединение отклонено).

Я проверил LISTENING порты на своем сервере, используяSysInternals TcpView и я не могу найти порт 555, указанный выше.

Я подозреваю проблему, связанную с .Net Remoting, но не могу понять, как ее решить.Есть идеи?

Заранее спасибо.

1 Ответ

0 голосов
/ 29 апреля 2019

может использовать http://topshelf -project.com / для размещения планировщика, который будет предоставлять hostFactory и использовать его для хранения хоста через HttpSelfHostServer, http лучше, так как вы можете вызывать задание через контроллер. Пример кода, как показано ниже

надеюсь, это поможет.

using System;
using System.Configuration;
using System.Web.Http;
using System.Web.Http.SelfHost;
using Topshelf;
     class Program
    {
        static void Main(string[] args)
        {
            HostFactory.Run(hostConfigurator =>
            {
                if (!Uri.TryCreate("http://localhost:8080", UriKind.RelativeOrAbsolute, out var hostname))
                {
                    throw new ConfigurationErrorsException($"Could not uri");
                }

                var serviceName = "my service";

                var hostConfiguration = new HttpSelfHostConfiguration(hostname);
                hostConfiguration.Routes.MapHttpRoute("API", "{controller}/{action}/{id}", (object)new
                {
                    id = RouteParameter.Optional
                });

                var httpSelfHostServer = new HttpSelfHostServer(hostConfiguration);

                // Impl.Scheduler would be your implementation of scheduler
                hostConfigurator.Service<Impl.Scheduler>(s =>
                {
                    s.ConstructUsing(name => new Impl.Scheduler());
                    s.WhenStarted(tc =>
                    {
                        tc.Start();

                        httpSelfHostServer.OpenAsync().Wait();
                    });
                    s.WhenStopped(tc =>
                    {
                        tc.Stop();
                        //dispose scheduler implementation if using IOC container
                        httpSelfHostServer.CloseAsync().Wait();
                    });
                });
                hostConfigurator.RunAsLocalSystem();

                hostConfigurator.SetDescription(serviceName);
                hostConfigurator.SetDisplayName(serviceName);
                hostConfigurator.SetServiceName(serviceName);
            });
        }
    }
...