quartz.net 是一个非常好的任务运行开源框架.

我在做windform程序的时候,准备集成quartz.net 任务框架执行任务.

结果发现集成到一起的时候结果有冲突.

问题描述:

如果直接启动winform程序的时候,这个时候调用quartz.net 的时候没有问题,

如果使用对话框窗体的时候,quartz就会报错,估计是ui的线程与quartz线程

冲突的缘故.

这个时候我想可以使用远程任务来处理这个冲突,我在winform只是做任务管理.

任务的执行使用远程服务器来执行任务.这样会有另外一个好处,我们可以把服务器做成

一个windows服务.这样任务执行就可以在使用服务来执行了.我们可以不用使用

winform程序一直打开了.

知识点:

1.配置quartz.net 远程方式执行.

2.配置数据库存储任务.

 

1.配置远程执行方式执行:

在服务端项目中添加一个应用配置文件.

注意:我配置的端口为555,服务端绑定服务名称:QuartzScheduler

<quartz>
   <add key="quartz.scheduler.exporter.type" value="Quartz.Simpl.RemotingSchedulerExporter, Quartz"/>
   <add key="quartz.scheduler.exporter.port" value="555"/>
   <add key="quartz.scheduler.exporter.bindName" value="QuartzScheduler"/>
   <add key="quartz.scheduler.exporter.channelType" value="tcp"/>
  
  </quartz>

 在客户端配置如下:

<quartz>
  <add key="quartz.scheduler.instanceName" value="QuartzScheduler"/>
  <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
  <add key="quartz.threadPool.threadCount" value="5"/>
  <add key="quartz.threadPool.threadPriority" value="Normal"/>
  <add key="quartz.scheduler.proxy" value="true"/>
  <add key="quartz.scheduler.proxy.address" value="tcp://localhost:555/QuartzScheduler"/>
 </quartz>

 注意:

  配置quartz.scheduler.proxy.address 的那个服务名需要与服务端的一致,QuartzScheduler这个就是

服务端绑定的名称.

客户端代码如下:

    ISchedulerFactory sf = new StdSchedulerFactory();
            IScheduler sched = sf.GetScheduler();
            // computer a time that is on the next round minute
            DateTime runTime = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow);

            // define the job and tie it to our HelloJob class
            JobDetail job = new JobDetail("job1", "group1", typeof(job.HelloJob));
            JobDataMap map=new JobDataMap();
            map.Add(" Name","测试");
            map.Add(" Id",1);
            job.JobDataMap = map;

            // Trigger the job to run on the next round minute
            SimpleTrigger trigger = new SimpleTrigger("trigger1", "group1", runTime);

            // Tell quartz to schedule the job using our trigger
            sched.ScheduleJob(job, trigger);

这个时候我们需要注意到我们定制任务的时候我们自己实现了IJob接口,来实现自定义任务已完成我们的工作.

那在服务端执行任务的时候,也需要找到这个HelloJob程序集,所以我把任务做成一个单独的库项目,编译成DLL后,

放到服务端执行程序目录中,已便让服务程序找到需要执行的程序集.

2.配置使用数据库存储服务.

将任务配置到数据库的好处是当服务器重启后,任务还是可以在数据库加载.

为了方便我们使用轻量级的数据库来实现这个,我选择SQLLite来做.

配置sqllite的时候我们可能碰到找不到System.Data.SQLite.dll程序集的错误.

经过研究发现quartz.net 支持的数据库配置在源码的IMpl\AdoJobStore\common\dbproviders.properties

文件中,找到sqllite那一段代码.

quartz.dbprovider.SQLite-10.assemblyName=System.Data.SQLite, Version=1.0.56.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139
quartz.dbprovider.SQLite-10.connectionType=System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.56.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139
quartz.dbprovider.SQLite-10.commandType=System.Data.SQLite.SQLiteCommand, System.Data.SQLite, Version=1.0.56.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139
quartz.dbprovider.SQLite-10.parameterType=System.Data.SQLite.SQLiteParameter, System.Data.SQLite, Version=1.0.56.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139
#quartz.dbprovider.SQLite-10.dataAdapterType=System.Data.SQLite.SQLiteDataAdapter , System.Data.SQLite, Version=1.0.56.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139
quartz.dbprovider.SQLite-10.commandBuilderType=System.Data.SQLite.SQLiteCommandBuilder, System.Data.SQLite, Version=1.0.56.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139
#quartz.dbprovider.SQLite-10.commandBuilderDeriveParametersMethod=DeriveParameters
quartz.dbprovider.SQLite-10.parameterDbType=System.Data.SQLite.TypeAffinity, System.Data.SQLite, Version=1.0.56.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139
quartz.dbprovider.SQLite-10.parameterDbTypePropertyName=DbType
#quartz.dbprovider.SQLite-10.parameterIsNullableProperty=IsNullable
quartz.dbprovider.SQLite-10.parameterNamePrefix=@
quartz.dbprovider.SQLite-10.exceptionType=System.Data.SQLite.SQLiteException, System.Data.SQLite, Version=1.0.56.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139
quartz.dbprovider.SQLite-10.useParameterNamePrefixInParameterCollection=true
quartz.dbprovider.SQLite-10.bindByName=true

而我下载到的版本是1.0.60.0,我把Version=1.0.56.0替换为Version=1.0.60.0,另外我把PublicKeyToken直接替换为空.

编辑完后我们重新编译源码项目.

我们新建一个mydb.db的sqlite数据库.并使用tables_sqlite.sql脚本创建quartz所需要的表.

我们编辑 App.config 文件]

<quartz>

<add key="quartz.jobStore.misfireThreshold" value="60000"/>
   <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"/>
   <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz"/>
   <add key="quartz.jobStore.useProperties" value="false"/>
   <add key="quartz.jobStore.dataSource" value="default"/>
   <add key="quartz.jobStore.tablePrefix" value="QRTZ_"/>


   <add key="quartz.dataSource.default.connectionString" value="Data Source=mydb.db" />
   <add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz"/>
   <add key="quartz.dataSource.default.provider" value="SQLite-10"/>

</quartz>

这样服务端就支持使用数据库来存储任务了.

 

posted on 2008-11-29 21:43  自由港  阅读(3818)  评论(1编辑  收藏  举报