Quartz 监控学习记录(一)添加监控

由于项目需要做一个定时任务监控的功能,所以学习了一下Quartz的基本使用方法,以及对定时任务执行的使用方法,以下是详细的介绍
首先,创建一个PickNewsJob类实现Job接口
PickNewsJob.java

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class PickNewsJob implements Job {

    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        System.out.println("This is PickNewsJob`s execute method");
    }

}

然后创建一个对Job的监听MonitorJobListener实现自JobListener
MonitorJobListener.java

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;

public class MonitorJobListener implements JobListener {

    public static final String LISTENER_NAME = "JobListenerName";

    @Override
    public String getName() {
        return LISTENER_NAME;
    }

    /**
     * 定时任务开始执行
     */
    @Override
    public void jobToBeExecuted(JobExecutionContext context) {
        String jobName = context.getJobDetail().getKey().toString();
        System.out.println("jobToBeExecuted");
        System.out.println("Job : " + jobName + " is going to start...");
    }

    /**
     * 执行被否决
     */
    @Override
    public void jobExecutionVetoed(JobExecutionContext context) {
        System.out.println("jobExecutionVetoed");
    }

    /***
     * 定时任务执行完毕
     */
    @Override
    public void jobWasExecuted(JobExecutionContext context,
            JobExecutionException jobException) {
        System.out.println("jobWasExecuted");

        String jobName = context.getJobDetail().getKey().toString();
        System.out.println("Job : " + jobName + " is finished...");

        if (jobException != null && !jobException.getMessage().equals("")) {
            System.out.println("Exception thrown by: " + jobName
                + " Exception: " + jobException.getMessage());
        }
    }

}

再创建一个MainApp来测试监听是否有用
MainApp.java

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.JobListener;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.KeyMatcher;

public class MainApp {

    public static void main(String[] args) throws SchedulerException {

        //创建定时任务
        JobDetail Job1 = JobBuilder.newJob(PickNewsJob.class)
                .withIdentity("job1", "jgroup1").build();


        //创建一个触发器,并将触发周期设置为1分钟
        SimpleTrigger Trigger1 = TriggerBuilder
                .newTrigger()
                .withIdentity("trigger1","jgroup1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(1).repeatForever()).build();

        //获取Scheduler工厂实例
         Scheduler scheduler = new StdSchedulerFactory().getScheduler();
         JobListener myTriggerListener = new MonitorJobListener();


         KeyMatcher<JobKey> tkeyMatcher2 = KeyMatcher.keyEquals(Job1.getKey());
         //添加job的监听
         scheduler.getListenerManager().addJobListener(myTriggerListener, tkeyMatcher2);
         //添加定时任务
         scheduler.scheduleJob(Job1, Trigger1);

         //加载定时任务
         scheduler.start();
    }
}

最后在控制台输出的结果为:

jobToBeExecuted
Job : jgroup1.job1 is going to start…
This is PickNewsJob`s execute method
jobWasExecuted
Job : jgroup1.job1 is finished…

如果需要对触发器进行监控,只需要将稳中涉及到的JobListener的地方修改为TriggerListener,然后修改相应的内容即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,首先需要了解 Redis 的基本知识和 Java 中 Redis 的使用方法。 在 Java 中使用 Redis 的常用方法是通过使用 Redis 客户端连接库,如 Jedis、Lettuce 等。 假设我们有一个名为 "task1" 的监控任务,并希望在任务完成后一段时间内再次执行。 我们可以在 Redis 中使用一个计数器来记录任务执行的次数。为了保证任务只执行一次,我们可以使用 Redis 的分布式锁机制,这样我们就可以在 Java 代码中实现如下流程: 1. 使用 Redis 客户端获取分布式锁。 2. 执行监控任务。 3. 使用 Redis 客户端对计数器加 1。 4. 释放分布式锁。 5. 设置定时器,在指定时间后再次执行监控任务。 具体实现细节可以参考 Redis 客户端的文档和相关示例代码。 ### 回答2: 在使用Java和Redis进行监控任务一次重复完成的场景设计中,可以使用Redis作为消息队列来实现任务的排队和调度。 首先,在Redis中创建一个List类型的数据结构,用于存储需要执行的任务。当一个任务需要被监控的时候,将其添加到该List中。 接下来,在Java中创建一个监控任务的执行器,该执行器从Redis中获取任务,进行执行,并处理任务执行成功或失败后的相应操作。 具体的实现步骤如下: 1. 在Redis中创建一个List类型的数据结构,用作任务队列: ```java Jedis jedis = new Jedis("localhost"); jedis.rpush("task_queue", "task1"); jedis.rpush("task_queue", "task2"); ``` 2. 创建一个Java监控任务执行器,从Redis中获取任务并执行: ```java Jedis jedis = new Jedis("localhost"); String task = jedis.lpop("task_queue"); while (task != null) { // 执行任务 boolean success = executeTask(task); // 判断任务是否执行成功 if (success) { System.out.println("任务执行成功:" + task); // 处理任务执行成功后的操作 } else { System.out.println("任务执行失败:" + task); // 处理任务执行失败后的操作 } // 继续获取下一个任务 task = jedis.lpop("task_queue"); } ``` 3. 执行任务的具体逻辑根据实际需求编写,可以是调用其他接口、执行数据库操作等等。 通过以上设计,可以实现监控任务的一次重复完成的场景。当有新的任务需要被监控时,将其添加到Redis的任务队列中,Java监控任务执行器会从队列中获取任务并进行执行,根据任务的执行结果进行相应的处理操作。这样可以实现任务的有序处理和监控,并确保每个任务只被执行一次。 ### 回答3: 在使用Java和Redis设计监控任务一次重复完成的场景时,可以按照以下步骤进行操作: 1. 创建一个定时任务:使用Java的定时任务框架(比如Quartz),设置一个定时任务来执行监控任务。 2. 在定时任务中访问Redis:在定时任务中,通过Java的Redis客户端(比如Jedis)访问Redis数据库。 3. 检查任务状态:在Redis中维护一个任务状态的键值对,键为任务ID,值为任务的状态。在每次定时任务执行时,首先查询Redis中该任务的状态。 4. 判断任务状态:如果任务的状态为未完成或正在进行中,则说明任务还未完成,需要继续执行。如果任务的状态为已完成,则说明任务已经重复执行完成,可以停止定时任务。 5. 执行任务:当任务状态为未完成或正在进行中时,执行任务的具体操作。 6. 更新任务状态:在任务执行完毕后,更新Redis中该任务的状态为已完成。 7. 终止定时任务:如果任务状态为已完成,则终止定时任务,不再重复执行。 通过以上步骤,我们可以实现一个监控任务一次重复完成的场景。每次定时任务执行时,首先查询任务的状态,如果状态为已完成,则停止定时任务;如果状态为未完成或正在进行中,则执行具体任务,并在任务完成后更新任务状态。通过Redis的键值对来维护任务的状态,可以方便地对任务状态进行读写和更新,保证了任务状态的准确和一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值