Quartz

本文详细介绍了如何在JBOSS环境下部署Quartz任务调度系统,包括创建必要表、引入相关包、配置quartz-service.xml文件、实现QuartzJob类以及具体调用流程。确保了系统的稳定性和高效执行。
部署运行你感兴趣的模型镜像

在数据库中创建Quartz所需表(sql语句可以在quartz-1.8.5\docs\dbTables中找到,

       这里以oracle数据库为例):

qrtz_blob_triggers,

qrtz_calendars,

qrtz_cron_triggers,

qrtz_fired_triggers,

qrtz_job_details,

qrtz_job_listeners,

qrtz_locks,

qrtz_paused_trigger_grps,

qrtz_scheduler_state,

qrtz_simple_triggers,

qrtz_triggers,

        qrtz_trigger_listeners

 

      

加入quartz所需要的包(放入jboss-4.2.3.GA\server\all\lib下):

 

 先把jboss自带的quartz jar删除掉。包括(quartz-ra.rar)都删除掉。

 

commons-dbcp-1.3.jar

commons-pool-1.5.4.jar

jta-1.1.jar

log4j-1.2.14.jar

quartz-all-1.8.5.jar

slf4j-api-1.6.0.jar

        slf4j-log4j12-1.6.0.jar
3.创建quartz-service.xml文件(放入jboss-4.2.3.GA\server\all\deploy下),文件内容如下:

 <?xml version="1.0" encoding="UTF-8"?>

<server>

  <mbean code="org.quartz.ee.jmx.jboss.QuartzService"

      name="user:service=QuartzService,name=QuartzService">

         <attribute name="JndiName">Quartz</attribute>

         <attribute name="StartScheduler">true</attribute>

<attribute name="Properties">

#============================================================================

# Configure Main Scheduler Properties

#============================================================================

         #==========集群名称,每个节点的名字都一样===========

         org.quartz.scheduler.instanceName = quartzjbossdemopartitionName

         #==========集群每个节点ID=======

org.quartz.scheduler.instanceId = AUTO

 

#============================================================================

# Configure ThreadPool

#============================================================================

         #=======线程====

         org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

         org.quartz.threadPool.threadCount = 25

         org.quartz.threadPool.threadPriority = 5

 

#============================================================================

# Configure JobStore

#============================================================================

 

      org.quartz.jobStore.misfireThreshold = 60000

      org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate

      org.quartz.jobStore.dataSource = QUARTZ

      org.quartz.jobStore.tablePrefix = QRTZ_

 

      org.quartz.jobStore.isClustered = true

      org.quartz.jobStore.clusterCheckinInterval = 30000

 

#============================================================================

# Configure Datasources

#============================================================================

                   #=================数据库写上自己的数据库======

         org.quartz.dataSource.QUARTZ.driver = oracle.jdbc.driver.OracleDriver

         org.quartz.dataSource.QUARTZ.URL = jdbc:oracle:thin:@192.168.111.24:1521:db        org.quartz.dataSource.QUARTZ.user = rootmq

         org.quartz.dataSource.QUARTZ.password = rootmq

         org.quartz.dataSource.QUARTZ.maxConnections = 5

         org.quartz.dataSource.QUARTZ.validationQuery=select 0 from dual

        

</attribute>

  </mbean>

 

</server>
4.       java代码
每一个 Quartz Job 必须有一个实现了org.quartz.Job接口的具体类.

 

publicclass JbossJobimplements Job {

 

publicvoid execute(JobExecutionContext arg0)throws JobExecutionException {

   System.out.println("hello jbossJob .....");

}

 

}
5.   具体调用

 publicclass StartOrCloseSchedulerimplements Serializable{

 

 

   /**

    *

    */

   privatestaticfinallongserialVersionUID = -2266323478579408291L;

   privatestatic LoggermyLogger = Logger.getLogger(StartOrCloseScheduler.class);

   privatestatic Schedulersched =null;

   /**

    *启动任务

    * jobName: job名称

    * jobGroupName: job组名称

    * triggerName: trigger名称

    * triggerGroupName:trigger组名称

    */

   @SuppressWarnings("rawtypes")

   publicstaticvoid start(String jobName,String jobGroupName,

           String triggerName,String triggerGroupName,

           Class c, String str) {

      try {

          InitialContext ctx =new InitialContext();

           sched = (Scheduler) ctx.lookup("Quartz");

           System.out.println("Scheduler:" + sched);

      }catch (NamingException e) {

          e.printStackTrace();

      }

       JobDetail job =new JobDetail(jobName,jobGroupName, c);

       System.out.println("JobDetail:" + job);

        Trigger trigger =new CronTrigger(triggerName,triggerGroupName);

        System.out.println("Trigger:" + trigger);

   try {

      ((CronTrigger) trigger).setCronExpression(str);

          sched.scheduleJob(job, trigger);

          System.out.println("job:" + job);

          sched.start();

      }catch (Exception e) {

          myLogger.error("开启一个任务"+jobName+e.getMessage());

          e.printStackTrace();

      }

 

   }

 

 

   /**

    *移除一个任务

    *@param jobName: job名称

    *@param jobGroupName: job组名称

    *@param triggerName: trigger名称

    *@param triggerGroupName: trigger组名称

    *@throws SchedulerException

    */

   publicstaticvoid removeJob(String jobName,String jobGroupName,

                                String triggerName,String triggerGroupName) {

   try {

          InitialContext ctx =new InitialContext();

           sched = (Scheduler) ctx.lookup("Quartz");

      }catch (NamingException e) {

          e.printStackTrace();

      }

   try {

          //停止触发器

          sched.pauseTrigger(triggerName,triggerGroupName);

          //移除触发器

          sched.unscheduleJob(triggerName,triggerGroupName);

          //删除任务

          sched.deleteJob(jobName,jobGroupName);

      }catch (SchedulerException e) {

          myLogger.info("移除一个任务"+jobName+e.getMessage());

      }

   }

 

}
 

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

Quartz 是一个功能强大的任务调度框架,广泛应用于企业级应用中,用于处理复杂的任务调度需求。以下是关于 Quartz 的使用指南、配置方法以及问题解决的详细说明。 ### 使用指南 Quartz 提供了多种方式来定义和管理任务。核心组件包括 `Job`(任务)、`Trigger`(触发器)和 `Scheduler`(调度器)。任务的执行逻辑通常通过实现 `Job` 接口来定义,而触发器则决定了任务何时执行。调度器负责管理任务和触发器的生命周期。 以下是一个简单的任务实现示例: ```java import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class SimpleJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("任务正在执行..."); } } ``` 接下来,需要定义一个触发器来指定任务的执行时间。可以使用 `CronTrigger` 来基于 CRON 达式进行调度: ```java import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class QuartzExample { public static void main(String[] args) throws Exception { // 创建任务详情 JobDetail job = JobBuilder.newJob(SimpleJob.class) .withIdentity("simpleJob", "group1") .build(); // 创建触发器,每分钟执行一次 CronTrigger trigger = TriggerBuilder.newTrigger() .withIdentity("cronTrigger", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0 * * * * ?")) .build(); // 获取调度器并启动 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.start(); // 将任务和触发器注册到调度器 scheduler.scheduleJob(job, trigger); } } ``` ### 配置方法 Quartz 提供了丰富的配置选项,以支持持久化、集群部署和高可用性等高级特性。这些配置通常在 `quartz.properties` 文件中进行设置。 #### 持久化配置 为了确保任务调度的状态在系统重启后仍然保留,可以将 Quartz 配置为使用数据库进行持久化。以下是一个简单的数据库配置示例: ```properties org.quartz.scheduler.instanceName=MyScheduler org.quartz.threadPool.threadCount=3 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource=myDS org.quartz.dataSource.myDS.driver=com.mysql.cj.jdbc.Driver org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/quartz org.quartz.dataSource.myDS.user=root org.quartz.dataSource.myDS.password=root org.quartz.dataSource.myDS.maxConnections=5 ``` #### 集群配置 在集群环境中,多个 Quartz 实例可以共享同一个数据库,以实现任务的高可用性和负载均衡。以下是一个集群配置的示例: ```properties org.quartz.scheduler.instanceName=MyClusteredScheduler org.quartz.scheduler.instanceId=AUTO org.quartz.threadPool.threadCount=3 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource=myDS org.quartz.jobStore.isClustered=true org.quartz.jobStore.clusterCheckinInterval=20000 org.quartz.dataSource.myDS.driver=com.mysql.cj.jdbc.Driver org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/quartz org.quartz.dataSource.myDS.user=root org.quartz.dataSource.myDS.password=root org.quartz.dataSource.myDS.maxConnections=5 ``` ### 问题解决 在使用 Quartz 时,可能会遇到一些常见问题。以下是一些解决方案和最佳实践: 1. **任务未按预期执行**:检查 CRON 达式是否正确,并确保调度器已启动。可以通过日志查看调度器的状态和任务的执行情况。 2. **持久化失败**:确保数据库连接配置正确,并且数据库结构符合 Quartz 的要求。可以使用 Quartz 提供的 SQL 脚本来创建所需的3. **集群节点无法同步**:检查集群节点之间的网络连接,并确保所有节点使用相同的数据库配置。此外,确认 `clusterCheckinInterval` 设置合理,以便节点能够及时更新状态。 4. **任务执行异常**:可以通过实现 `SchedulerListener` 接口来监听任务和触发器的状态变化,并在发生错误时进行处理。以下是一个简单的 `SchedulerListener` 实现示例: ```java import org.quartz.SchedulerListener; import org.quartz.SchedulerException; public class MySchedulerListener implements SchedulerListener { @Override public void jobScheduled(Trigger trigger) { System.out.println("任务已调度: " + trigger.getKey()); } @Override public void jobUnscheduled(String triggerName, String triggerGroup) { System.out.println("任务已取消: " + triggerName + "/" + triggerGroup); } @Override public void triggerFinalized(Trigger trigger) { System.out.println("触发器已最终化: " + trigger.getKey()); } @Override public void triggersPaused(String triggerName, String triggerGroup) { System.out.println("触发器已暂停: " + triggerName + "/" + triggerGroup); } @Override public void triggersResumed(String triggerName, String triggerGroup) { System.out.println("触发器已恢复: " + triggerName + "/" + triggerGroup); } @Override public void jobsPaused(String jobName, String jobGroup) { System.out.println("任务已暂停: " + jobName + "/" + jobGroup); } @Override public void jobsResumed(String jobName, String jobGroup) { System.out.println("任务已恢复: " + jobName + "/" + jobGroup); } @Override public void schedulerError(String msg, SchedulerException cause) { System.out.println("调度器错误: " + msg); cause.printStackTrace(); } @Override public void schedulerStarted() { System.out.println("调度器已启动"); } @Override public void schedulerInStandbyMode() { System.out.println("调度器进入待机模式"); } @Override public void schedulerShutdown() { System.out.println("调度器已关闭"); } @Override public void schedulingDataCleared() { System.out.println("调度数据已清除"); } } ``` 通过以上指南和配置方法,可以有效地使用 Quartz 进行任务调度,并解决可能出现的问题。结合实际业务需求,合理配置持久化和集群选项,并应用安全机制,可以确保任务调度系统的安全、稳定和可靠 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值