У меня проблемы с этим ... У меня есть два проекта, один из которых - 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 никогда не вызывается.
Я считаю, что это либо что-то в контейнере, либо я что-то упустил, какие-либо предложения? чувствую себя потерянным, я понятия не имею, что можно попробовать