基于Redis的Java作业调度器?

Mil*_*hev 5 java job-scheduling redis

我希望在我们的项目中取代 Quartz 作为作业调度程序。我们已经使用具有集群支持的 Redis 作为分布式缓存层,我们认为也许我们也可以使用 Redis 进行作业调度。有没有人使用 Redis 在 Java 中实现作业调度?我为此进行了搜索,但找不到图书馆。所以我开始认为这可能不是一个流行的解决方案?

Nik*_*rov 6

看看雷迪森。它允许使用简单的ScheduledExecutorService api 并基于 Redis 队列来调度和执行任务(使用 cron 表达式支持)。

这是一个例子。首先使用java.lang.Runnable接口定义一个任务。每个任务都可以通过注入的对象访问Redis实例RedissonClient

public class RunnableTask implements Runnable {

    @RInject
    private RedissonClient redissonClient;

    @Override
    public void run() throws Exception {
        RMap<String, Integer> map = redissonClient.getMap("myMap");
        Long result = 0;
        for (Integer value : map.values()) {
            result += value;
        }
        redissonClient.getTopic("myMapTopic").publish(result);
    }

}
Run Code Online (Sandbox Code Playgroud)

提交给基于Redis的ExecutorService。

RScheduledExecutorService executorService = redisson.getExecutorService("myExecutor");
RScheduledFuture<?> future = executorService.schedule(new CallableTask(), 10, 20, TimeUnit.MINUTES);

future.get();
// or cancel it
future.cancel(true);

// cancel by taskId
executorService.cancelTask(future.getTaskId());
Run Code Online (Sandbox Code Playgroud)

cron 表达式的例子:

executorService.schedule(new RunnableTask(), CronSchedule.of("10 0/5 * * * ?"));

executorService.schedule(new RunnableTask(), CronSchedule.dailyAtHourAndMinute(10, 5));

executorService.schedule(new RunnableTask(), CronSchedule.weeklyOnDayAndHourAndMinute(12, 4, Calendar.MONDAY, Calendar.FRIDAY));
Run Code Online (Sandbox Code Playgroud)

所有任务都分布在Redisson 节点上。您可以根据需要运行这些节点。


Ita*_*ber 1

Redis Labs 的redis-quartz怎么样:

RedisJobStore 使用 Redis 进行持久存储的 Quartz Scheduler JobStore。

我们将不胜感激您的任何反馈:)

  • redis-quartz 能否与我们的 Redis 3.0 集群完美配合? (2认同)