Member 12885549 Ответов: 1

Бежать.Объем основного веб-приложения и запустить процесс одновременно


Я пытаюсь добиться одного: бежать .Объем основного веб-приложения (с помощью Kestrel) и запустить кварцевые.Чистый процесс, который выполнял бы некоторые методы. Но все мои попытки были безуспешны. Они оба работают отдельно, но я не могу управлять ими одновременно.

Мой процесс все время работает на сервере linux, где он должен проверять наличие изменений в базе данных. Мне нужно было добавить веб-страницу, чтобы увидеть результаты печати. Поэтому я хочу иметь возможность просматривать эти результаты в интернете (localhost:5000), но также и для того, чтобы процесс продолжал работать.

Возможно ли сделать то, чего я пытаюсь достичь? (запустите веб-процесс и консольный процесс, и пусть они оба работают до тех пор, пока программа запущена)?

Что я уже пробовал:

это мой класс "Startup.cs":
public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton();
        services.AddLogging();
        var serviceProvider = services.BuildServiceProvider();
        services.AddMvc();
        services.AddSingleton(Configuration);
        return WindsorRegistrationHelper.CreateServiceProvider(ContainerManager.Container, services);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

    }


а это мой класс Program.cs. Веб-работа сейчас, однако процесс еще не запущен. Комментируемый код-это один из многих способов, которыми я пытался запустить оба, но потерпел неудачу.

class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();   
    }

    public static IWebHost BuildWebHost(string[] args)
    {
        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true)
            .AddCommandLine(args)
            .Build();

        return host = new WebHostBuilder()
            .UseKestrel()
            .UseConfiguration(config)
            .UseStartup()
           .Build();
    }

    //static void Main(string[] args)
    //{
    //    var ConsOut = Console.Out; 
    //    Console.SetOut(new StreamWriter(Stream.Null));
    //    BuildWebHost(args).Start();                    
    //    Console.SetOut(ConsOut); 
    //    while (true)
    //    {
    //        RunIbit();
    //    }
    //}

    //public static IWebHost BuildWebHost(string[] args)
    //{
    //    var config = new ConfigurationBuilder()
    //        .SetBasePath(Directory.GetCurrentDirectory())
    //        .AddJsonFile("appsettings.json", optional: true)
    //        .AddCommandLine(args)
    //        .Build();

    //    var host = new WebHostBuilder()
    //        .UseKestrel()
    //        .UseConfiguration(config)
    //        .UseStartup()
    //        .UseIISIntegration()
    //       .Build();

    //    return host;
    //}

    public static void RunIbit()
    {
        IServiceCollection services = new ServiceCollection();
        Startup startup = new Startup();
        var serviceProvider = startup.ConfigureServices(services);
        IWindsorContainer container = serviceProvider.GetService();
        var configuration = container.Resolve();
        var cron = configuration[Enums.ExecutionTime];
        var _logger = container.Resolve();
        var isRunning = false;
        Execute(cron); 
        while (true)
        {
            if (!isRunning)
            {
                isRunning = true;
            }
        }
    }

    public static async void Execute(string cron)
    {
        NameValueCollection props = new NameValueCollection
        {
            { "quartz.serializer.type", "binary" }
        };
        StdSchedulerFactory factory = new StdSchedulerFactory(props);

        var sched = await factory.GetScheduler();
        await sched.Start();

        var job = JobBuilder.Create()
            .Build();

        var trigger = TriggerBuilder.Create()
            .WithCronSchedule(cron)
            .ForJob(job.Key)
            .Build();
        await sched.ScheduleJob(job, trigger);
    }
}

[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
public class Job : IJob
{
    public Task Execute(IJobExecutionContext context)
    {
        var key = context.JobDetail.Key;
        try
        {
            var t = new Task(() =>
            {
                process.MainProcess();
            });
            return Task.CompletedTask;
        }
        catch (Exception e)
        {
        }
        return null;
    }
}

1 Ответов

Рейтинг:
6

Vincent Maverick Durano

Вы используете версию 3.x кварца? Если это так, то взгляните на это краткое обсуждение о том, как запустить его на .NET Core: https://stackoverflow.com/questions/41821568/how-to-start-quartz-in-asp-net-core

Идея состоит в том, чтобы вызвать свой метод для запуска планировщика перед вызовом host.Run();


Member 12885549

Я серьезно люблю тебя, парень! Я потратил целую вечность, и решение было так просто! Спасибо!

Vincent Maverick Durano

Добро пожаловать! рад, что это сработало для тебя.

PS: Я действительно использовал Quartz.net тоже, но пока у меня нет возможности попробовать его с .NET Core. ;)