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("将触发器和任务器绑定到调度器中完成");
        }
Exemple #2
0
        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);
        }
Exemple #3
0
 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);
 }
Exemple #4
0
        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);
        }
Exemple #5
0
        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"));
        }
Exemple #6
0
        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");
     }
 }
Exemple #8
0
        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)));
        }