寻找可扩展的“at”实现

时间:2012-04-16 06:23:17

标签: java quartz-scheduler high-availability scheduled-tasks

我正在寻找可扩展的“at”替代品,具有高可用性。它必须支持在运行时添加和删除作业。

一些背景: 我有一个应用程序,我触发数百万个事件,每个事件只发生一次。我不需要类似cron的机制(本月的第一个星期日等),只需要日期,时间和背景。

目前我正在使用Quartz scheduler,虽然它是一个非常好的项目,但即使经过大量调整(分片,增加轮询间隔),它也难以处理我们抛出的事件数量。由于它在下划线数据库上执行的基本锁定。此外,对我们来说有点矫枉过正,因为基本上我们有一百万个一次性触发器和相对较少的工作。

我很感激任何建议

3 个答案:

答案 0 :(得分:1)

如果我面对同样的情况,我会做以下事情......

使用几个框上的队列复制设置来设置JMS队列集群(例如RabbitMQ或ActiveMQ)。

在我可用的高可用JMS队列中触发所有事件。

然后我会编写一个代理应用程序,根据需要弹出JMS队列的事件,我可以在多个盒子上运行多个代理,并将它与正确的JMS故障转移URL等结合起来。

如果您的工作正在解雇事件,您也可以使用相同类型的模型......

Fyi,核心Java中一种更好的调度方式如下:

ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(sensibleThreadCount);
    threadPool.scheduleAtFixedRate(new Runnable() {

    @Override
    public void run() {
       //Pop events from event queue.
       //Do some stuff with them.
    }

    }, initialDelay, period, TimeUnit.X);

答案 1 :(得分:0)

也许只需使用JGroups shared tree按执行时间排序的任务。节点将执行第一个任务和计划计时器,它将在给定时间执行。在任务删除计时器可以取消。 所以基本上你只能使用JGroups和简单的Java Timers / Executors。

我没有完整阅读,但这里有一些proof of concept or maybe even solution

答案 2 :(得分:0)

java计时器怎么样?

import java.util.*;

public class MyTask extends TimerTask{
   public void run(){
       System.out.println( "do it!" );
   }
}

然后

Timer timer = new Timer();

MyTask job1 = new MyTask();
// once after 2 seconds
timer.schedule( job1, 2000 );

job1.cancel();

MyTask job2 = new MyTask(); 
// nach each 5 seconds after 1 second
timer.schedule  ( job2, 1000, 5000 );