我正在寻找可扩展的“at”替代品,具有高可用性。它必须支持在运行时添加和删除作业。
一些背景: 我有一个应用程序,我触发数百万个事件,每个事件只发生一次。我不需要类似cron的机制(本月的第一个星期日等),只需要日期,时间和背景。
目前我正在使用Quartz scheduler,虽然它是一个非常好的项目,但即使经过大量调整(分片,增加轮询间隔),它也难以处理我们抛出的事件数量。由于它在下划线数据库上执行的基本锁定。此外,对我们来说有点矫枉过正,因为基本上我们有一百万个一次性触发器和相对较少的工作。
我很感激任何建议
答案 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 );