public async Task Inity() { //1、声明一个调度工厂 //2、通过调度工厂获得调度器 Scheduler = await schedulerFactory.GetScheduler(); DBConnectionManager.Instance.AddConnectionProvider("default", new DbProvider("SQLite-Microsoft", SqliteHelper.dataSource)); var serializer = new JsonObjectSerializer(); serializer.Initialize(); var jobStore = new JobStoreTX { DataSource = "default", TablePrefix = "QRTZ_", InstanceId = "AUTO", //DriverDelegateType = typeof(MySQLDelegate).AssemblyQualifiedName, //MySql存储 DriverDelegateType = typeof(SQLiteDelegate).AssemblyQualifiedName, //SQLite存储 ObjectSerializer = serializer }; DirectSchedulerFactory.Instance.CreateScheduler("benny" + "Scheduler", "AUTO", new DefaultThreadPool(), jobStore); Scheduler = SchedulerRepository.Instance.Lookup("benny" + "Scheduler").Result; //scheduler.Start(); //默认开始调度器 await Scheduler.Start(); //return await Task.FromResult("将触发器和任务器绑定到调度器中完成"); }
private async Task <IScheduler> GetScheduler() { //MySql存储 DBConnectionManager.Instance.AddConnectionProvider("default", new DbProvider("MySql", "server=127.0.0.1;user id=root;password=123456;database=quartz")); SimpleInstanceIdGenerator idGenerator = new SimpleInstanceIdGenerator(); var instanceId = await idGenerator.GenerateInstanceId(); var instancename = "SystemScheduler"; var serializer = new JsonObjectSerializer(); serializer.Initialize(); var jobStore = new JobStoreTX { DataSource = "default", TablePrefix = "QRTZ_", InstanceId = instanceId, InstanceName = instancename, DriverDelegateType = typeof(MySQLDelegate).AssemblyQualifiedName, //MySql存储 ObjectSerializer = serializer, Clustered = true }; DirectSchedulerFactory.Instance.CreateScheduler(instancename, instanceId, new DefaultThreadPool(), jobStore); var scheduler = await SchedulerRepository.Instance.Lookup(instancename); await scheduler.Start(); //默认开始调度器 return(scheduler); }
public static ISwarmBuilder UseSqlServer(this ISwarmBuilder builder) { builder.Services.AddSingleton <IJobStore>(provider => { var jobStore = new JobStoreTX { DataSource = "swarm", TablePrefix = "QRTZ_", InstanceId = "AUTO", DriverDelegateType = typeof(SqlServerDelegate).AssemblyQualifiedName, ObjectSerializer = new JsonObjectSerializer() }; return(jobStore); }); builder.Services.AddSingleton(provider => { var connectionString = provider.GetRequiredService <IOptions <SwarmOptions> >().Value.ConnectionString; return(new StdSchedulerFactory(new NameValueCollection { { "schedName", "Server" }, { "quartz.jobStore.type", "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" }, { "quartz.jobStore.driverDelegateType", "Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz" }, { "quartz.jobStore.tablePrefix", "QRTZ_" }, { "quartz.jobStore.useProperties", "true" }, { "quartz.serializer.type", "json" }, { "quartz.jobStore.dataSource", "swarn" }, { "quartz.dataSource.swarn.provider", "SqlServer" }, { "quartz.dataSource.swarn.connectionString", connectionString } }).GetScheduler().Result); }); builder.Services.AddSingleton <ISwarmStore, SqlServerSwarmStore>(); return(builder); }
public async Task <IScheduler> GetScheduler() { LogProvider.SetCurrentLogProvider(new QuartzLogProvider()); IScheduler _scheduler; string driverDelegateType; var db = Configuration.GetSection("DB").Value; switch (db) { case "MsSql": DBConnectionManager.Instance.AddConnectionProvider("default", new DbProvider("SqlServer", Configuration["ConnectionStrings:MsSqlConnection"])); driverDelegateType = typeof(SqlServerDelegate).AssemblyQualifiedName; break; case "MySql": DBConnectionManager.Instance.AddConnectionProvider("default", new DbProvider("MySql", Configuration["ConnectionStrings:MySqlConnection"])); driverDelegateType = typeof(MySQLDelegate).AssemblyQualifiedName; break; default: DBConnectionManager.Instance.AddConnectionProvider("default", new DbProvider("SqlServer", Configuration["ConnectionStrings:MsSqlConnection"])); driverDelegateType = typeof(SqlServerDelegate).AssemblyQualifiedName; break; } var serializer = new JsonObjectSerializer(); serializer.Initialize(); var jobStore = new JobStoreTX { DataSource = "default", TablePrefix = "QRTZ_", InstanceId = "AUTO", DriverDelegateType = driverDelegateType ?? string.Empty, //SQLServer存储 ObjectSerializer = serializer, //Clustered = true, //集群标志 //AcquireTriggersWithinLock = true, //如果是集群 建议设为true InstanceName = "Lion", }; var threadPool = new DefaultThreadPool { ThreadCount = 20, }; DirectSchedulerFactory.Instance.CreateScheduler("Scheduler", "AUTO", threadPool, jobStore); _scheduler = await SchedulerRepository.Instance.Lookup("Scheduler"); _scheduler.ListenerManager.AddJobListener(new MyJobListener(), GroupMatcher <JobKey> .AnyGroup()); //_scheduler.ListenerManager.AddTriggerListener(new MyTriggerListener(), GroupMatcher<TriggerKey>.AnyGroup()); _scheduler.ListenerManager.AddSchedulerListener(new MySchedulerListener()); return(_scheduler); }
private IScheduler CreateScheduler(string name, int threadPoolSize) { DBConnectionManager.Instance.AddConnectionProvider("default", new DbProvider("SqlServer-20", "Server=(local);Database=quartz;Trusted_Connection=True;")); var jobStore = new JobStoreTX { DataSource = "default", TablePrefix = "QRTZ_", InstanceId = "AUTO", DriverDelegateType = typeof(SqlServerDelegate).AssemblyQualifiedName }; DirectSchedulerFactory.Instance.CreateScheduler(name + "Scheduler", "AUTO", new SimpleThreadPool(threadPoolSize, ThreadPriority.Normal), jobStore); return(SchedulerRepository.Instance.Lookup(name + "Scheduler")); }
protected override Task <IScheduler> CreateScheduler(string name, int threadPoolSize) { DBConnectionManager.Instance.AddConnectionProvider("default", new DbProvider(TestConstants.DefaultSqlServerProvider, TestConstants.SqlServerConnectionString)); var jobStore = new JobStoreTX { DataSource = "default", TablePrefix = "QRTZ_", InstanceId = "AUTO", DriverDelegateType = typeof(SqlServerDelegate).AssemblyQualifiedName, ObjectSerializer = serializer }; DirectSchedulerFactory.Instance.CreateScheduler(name + "Scheduler", "AUTO", new DefaultThreadPool(), jobStore); return(SchedulerRepository.Instance.Lookup(name + "Scheduler")); }
/// <summary> /// 初始化Scheduler /// </summary> private async Task InitSchedulerAsync() { if (scheduler == null) { DBConnectionManager.Instance.AddConnectionProvider("default", dbProvider); var serializer = new JsonObjectSerializer(); serializer.Initialize(); var jobStore = new JobStoreTX { DataSource = "default", TablePrefix = "QRTZ_", InstanceId = "AUTO", DriverDelegateType = driverDelegateType, ObjectSerializer = serializer, }; DirectSchedulerFactory.Instance.CreateScheduler("bennyScheduler", "AUTO", new DefaultThreadPool(), jobStore); scheduler = await SchedulerRepository.Instance.Lookup("bennyScheduler"); } }
public async Task TestRecoveringRepeatJobWhichIsFiredAndMisfiredAtTheSameTime() { const string DsName = "recoverJobsTest"; DBConnectionManager.Instance.AddConnectionProvider(DsName, new DbProvider(TestConstants.DefaultSqlServerProvider, TestConstants.SqlServerConnectionString)); var jobStore = new JobStoreTX { DataSource = DsName, InstanceId = "SINGLE_NODE_TEST", InstanceName = DsName, MisfireThreshold = TimeSpan.FromSeconds(1) }; var factory = DirectSchedulerFactory.Instance; factory.CreateScheduler(new DefaultThreadPool(), jobStore); var scheduler = await factory.GetScheduler(); // run forever up to the first fail over situation RecoverJobsTestJob.runForever = true; await scheduler.Clear(); await scheduler.ScheduleJob( JobBuilder.Create <RecoverJobsTestJob>() .WithIdentity("test") .Build(), TriggerBuilder.Create() .WithIdentity("test") .WithSimpleSchedule(x => x .WithInterval(TimeSpan.FromSeconds(1)) .RepeatForever() ).Build() ); await scheduler.Start(); // wait to be sure job is executing await Task.Delay(TimeSpan.FromSeconds(2)); // emulate fail over situation await scheduler.Shutdown(false); using (var connection = DBConnectionManager.Instance.GetConnection(DsName)) { connection.Open(); using (var command = connection.CreateCommand()) { command.CommandText = $"SELECT TRIGGER_STATE from QRTZ_TRIGGERS WHERE SCHED_NAME = '{scheduler.SchedulerName}' AND TRIGGER_NAME='test'"; var triggerState = command.ExecuteScalar().ToString(); // check that trigger is blocked after fail over situation Assert.AreEqual("BLOCKED", triggerState); command.CommandText = "SELECT count(*) from QRTZ_FIRED_TRIGGERS"; int count = Convert.ToInt32(command.ExecuteScalar()); // check that fired trigger remains after fail over situation Assert.AreEqual(1, count); } } // stop job executing to not as part of emulation fail over situation RecoverJobsTestJob.runForever = false; // emulate down time >> trigger interval - misfireThreshold await Task.Delay(TimeSpan.FromSeconds(4)); var isJobRecovered = new ManualResetEventSlim(false); factory.CreateScheduler(new DefaultThreadPool(), jobStore); IScheduler recovery = await factory.GetScheduler(); recovery.ListenerManager.AddJobListener(new TestListener(isJobRecovered)); await recovery.Start(); // wait to be sure recovered job was executed await Task.Delay(TimeSpan.FromSeconds(2)); // wait job await recovery.Shutdown(true); Assert.True(isJobRecovered.Wait(TimeSpan.FromSeconds(10))); }
public void TestRecoveringRepeatJobWhichIsFiredAndMisfiredAtTheSameTime() { const string DsName = "recoverJobsTest"; var connectionString = "Server=(local);Database=quartz;User Id=quartznet;Password=quartznet;"; DBConnectionManager.Instance.AddConnectionProvider(DsName, new DbProvider("SqlServer-20", connectionString)); var jobStore = new JobStoreTX { DataSource = DsName, InstanceId = "SINGLE_NODE_TEST", InstanceName = DsName, MisfireThreshold = TimeSpan.FromSeconds(1) }; var factory = DirectSchedulerFactory.Instance; factory.CreateScheduler(new SimpleThreadPool(1, ThreadPriority.Normal), jobStore); var scheduler = factory.GetScheduler(); // run forever up to the first fail over situation RecoverJobsTestJob.runForever = true; /* * scheduler.Clear(); * * scheduler.ScheduleJob( * JobBuilder.Create<RecoverJobsTestJob>() * .WithIdentity("test") * .Build(), * TriggerBuilder.Create() * .WithIdentity("test") * .WithSimpleSchedule(x => x * .WithInterval(TimeSpan.FromSeconds(1)) * .RepeatForever() * ).Build() * ); */ scheduler.Start(); // wait to be sure job is executing Thread.Sleep(2000); // emulate fail over situation scheduler.Shutdown(false); using (var connection = DBConnectionManager.Instance.GetConnection(DsName)) { connection.Open(); using (var command = connection.CreateCommand()) { command.CommandText = "SELECT TRIGGER_STATE from QRTZ_TRIGGERS"; var triggerState = command.ExecuteScalar().ToString(); // check that trigger is blocked after fail over situation Assert.AreEqual("BLOCKED", triggerState); command.CommandText = "SELECT count(*) from QRTZ_FIRED_TRIGGERS"; int count = Convert.ToInt32(command.ExecuteScalar()); // check that fired trigger remains after fail over situation Assert.AreEqual(1, count); } } // stop job executing to not as part of emulation fail over situation RecoverJobsTestJob.runForever = false; // emulate down time >> trigger interval - misfireThreshold Thread.Sleep(TimeSpan.FromSeconds(4)); ManualResetEvent isJobRecovered = new ManualResetEvent(false); factory.CreateScheduler(new SimpleThreadPool(1, ThreadPriority.Normal), jobStore); IScheduler recovery = factory.GetScheduler(); recovery.ListenerManager.AddJobListener(new TestListener(isJobRecovered)); recovery.Start(); // wait to be sure recovered job was executed Thread.Sleep(TimeSpan.FromSeconds(2)); // wait job recovery.Shutdown(true); Assert.True(isJobRecovered.WaitOne(TimeSpan.FromSeconds(10))); }