Registered Quartz. net планировщик не стреляет - PullRequest
0 голосов
/ 23 января 2020

У меня проблемы с этим ... У меня есть два проекта, один из которых - Asp. net, который использует кварц. и другое консольное приложение , которое также использует кварц, они совместно используют одну и ту же базу данных. первый работает отлично, проблема со вторым.

У меня есть этот класс, который получает экземпляр кварца:

    using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Threading.Tasks;

namespace AutoMatcher
{
    public class QuartzInstance
    {
        private static IScheduler instace = null;
        private static readonly object padlock = new object();
        private NameValueCollection props { get; }
        QuartzInstance()
        {

        }
        public static IScheduler Instance
        {
            get
            {
                lock (padlock)
                {
                    if (instace == null)
                    {
                        StdSchedulerFactory sche = new StdSchedulerFactory(SetPropeties());
                        instace = Task.Run(() => sche.GetScheduler()).GetAwaiter().GetResult();

                        instace.Start().Wait();
                    }
                }
                return instace;

            }
        }

        public static NameValueCollection SetPropeties()
        {
            NameValueCollection props = new NameValueCollection
            {
                {"quartz.scheduler.instanceName","QuartzConsumer" },
                {"quartz.scheduler.instanceId","QuartzConsumer" },
                {"quartz.jobStore.type","Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" },
                {"quartz.jobStore.dataSource","default" },
                {"quartz.jobStore.tablePrefix","QRTZ_" },
                {"quartz.dataSource.default.connectionString","server=(localdb)\\MSSQLLocalDB; database = AutoLoverDb; Trusted_Connection = true" },
                {"quartz.dataSource.default.provider","SqlServer" },
              //  {"quartz.threadPool.threadCount","1" },
                {"quartz.serializer.type","json" }

            };
            return props;
        }
    }
}

, и это как установщик autofa c класс выглядит так:

using AuthMatcher.ConsumerSchechuler;
using Autofac;
using Autofac.Extras.Quartz;
using AutoMatcher;
using AutoMatcher.Controllers;
using AutoMatcher.Interfaces;
using AutoMatcher.Jobs;
using AutoMatcher.Models;
using AutoMatcher.Services;
using AutoMatcherQueuesImpl;
using NLog;
using Owin;
using Quartz;
using System.Collections.Specialized;
using Workers.Factories;

namespace Workers
{
    public class InstallerClass
    {
        private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();

        public static IContainer Startup()
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<Application>().As<IApplication>();
            builder.RegisterType<RabbitMQImpl>().As<IQueue>().SingleInstance();
            builder.RegisterType<ConsumeSchechuler>().As<IConsumeSchechuler>();
            builder.RegisterType<BotFactory>().As<IBotFactory>();

            return builder.Build();

        }


    }
}

он регистрирует ConsumeSchechuler, а именно:

using AutoMatcher;
using AutoMatcher.Interfaces;
using AutoMatcher.Models;
using Quartz;
using System;
using System.Threading.Tasks;

namespace AuthMatcher.ConsumerSchechuler
{
    public class ConsumeSchechuler : IConsumeSchechuler
    {
        private IScheduler _scheduler;
        private string _uniqueId { get; set; }
        private string _userId;

        public ConsumeSchechuler()
        {
            _scheduler = QuartzInstance.Instance;
        }

        public async Task StartSchedule(int messageId, int likes, DateTime time, Service service)
        {
            if (time == DateTime.MinValue)
            {
                time = DateTime.UtcNow;
            }
            _uniqueId = Guid.NewGuid().ToString();
            IJobDetail job = JobBuilder.Create<ConsumerSchechulerJob>().WithIdentity(_uniqueId, "consumer").Build();
            job.JobDataMap.Put("message", new MessageWithoutUser { MessageId = messageId, UserId = _userId, Likes = likes, Time = time, Service = service });
            ITrigger trigger = TriggerBuilder.Create().WithIdentity(_uniqueId, "consumer")
                                                      .StartNow()
                                                      .Build();
            await _scheduler.ScheduleJob(job, trigger);
        }
    }
}

Строитель заданий создает ConsumerSchechulerJob, который выглядит следующим образом:

using AutoMatcher.IServices;
using AutoMatcher.Models;
using Quartz;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace AuthMatcher.ConsumerSchechuler
{
    public class ConsumerSchechulerJob : IJob
    {
        private IQueue _queue;
        public ConsumerSchechulerJob(IQueue queue)
        {
            _queue = queue;
        }
        public async Task Execute(IJobExecutionContext context)
        {
            Console.WriteLine("executing job");
            JobDataMap jobMap = context.JobDetail.JobDataMap;
            MessageWithoutUser message = (MessageWithoutUser)jobMap.Get("message");
            _queue.Queue(message);
        }
    }
}

сейчас что происходит, если задание сохраняется в базе данных, но оно не запускается планировщиком, а ConsumerSchechulerJob никогда не вызывается.

Я считаю, что это либо что-то в контейнере, либо я что-то упустил, какие-либо предложения? чувствую себя потерянным, я понятия не имею, что можно попробовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...