14

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

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

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

我会很感激任何建议

4

3 回答 3

1

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

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

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

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

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

仅供参考,在核心 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);
于 2012-06-07T09:28:27.447 回答
0

也许只是将JGroups 共享树与按执行时间排序的任务一起使用。节点将接受第一个任务并安排计时器,该计时器将在给定时间执行。可以取消任务删除计时器。所以基本上你可以只使用 JGroups 和简单的 java Timers/Executors。

我没有完整阅读它,但这里有一些概念证明,甚至可能是解决方案

于 2012-05-31T10:16:34.363 回答
-1

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 );
于 2012-06-05T13:55:42.043 回答