我正在寻找一个可扩展的"at“替代方案,具有高可用性。它必须支持在运行时添加和删除作业。
一些背景知识:我有一个应用程序,我触发了数百万个事件,每个事件只发生一次。我不需要cron之类的机制(每月的第一个星期天等),只需要日期、时间和上下文。
目前我正在使用Quartz scheduler,虽然它是一个非常好的项目,但它很难处理我们抛给它的大量事件,即使经过了很多调整(分片、增加轮询间隔等)。由于它在下划线数据库上执行基本锁定。此外,这对我们来说有点过头了,因为基本上我们有数百万个一次性触发器,而作业数量相对较少。
如果有任何建议,我将不胜感激。
发布于 2012-06-07 17:28:27
如果我面临同样的情况,我会这样做……
使用队列复制设置在几个框上设置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-05-31 18:16:34
也许只使用JGroups shared tree来处理按执行时间排序的任务。节点将接受第一个任务并调度定时器,定时器将在给定的时间执行。可以取消任务删除计时器。所以基本上你可以只使用JGroups和简单的java计时器/执行器。
我没有完整读完,但这里有一些proof of concept or maybe even solution
发布于 2012-06-05 21:55:42
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 );https://stackoverflow.com/questions/10169537
复制相似问题