Java 寻找一个可扩展的;at";实施

Java 寻找一个可扩展的;at";实施,java,quartz-scheduler,high-availability,scheduled-tasks,Java,Quartz Scheduler,High Availability,Scheduled Tasks,我正在寻找一个可扩展的“at”替代品,具有高可用性。它必须支持在运行时添加和删除作业 一些背景: 我有一个触发数百万个事件的应用程序,每个事件只发生一次。我不需要类似cron的机制(每月的第一个星期日等),只需要日期、时间和上下文 目前,我正在使用,虽然它是一个非常好的项目,但它很难处理我们向它抛出的事件量,即使在经过大量调整(切分、增加轮询间隔等)之后,因为它对underline数据库执行基本锁定。而且,这对我们来说有点过头了,因为基本上我们有数百万个一次性触发器,工作相对较少 如果您有任何建

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

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

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

如果您有任何建议

只用于按执行时间排序的任务,我将不胜感激。节点将执行第一个任务和调度计时器,该计时器将在给定时间执行。可以取消“在任务上删除计时器”。 因此,基本上您可以只使用jgroup和简单的java定时器/执行器


我没有完整地读过,但这里有一些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 );

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

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

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

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

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

仅供参考,在core 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);

你对失败的要求是什么?例如,如果一台机器发生故障,您是否希望在更换机器时触发“错过”事件?是的,类似于Quartz。另外,我在集群中运行Quartz,因此总是有一台温暖的机器在等待(在Quartz中,所有节点每次需要轮询DB以获取作业时都会竞争),我只是想知道没有Quartz,我们可以让事情变得多么简单。但是,如果每一份工作都必须得到承认,那就更加棘手了。如果一个作业运行两次会受到什么惩罚?(例如,您能否确认在最后一分钟内执行的所有作业,每分钟一次?)我无法运行作业两次,因为其中一些作业会向用户发送消息。作业确认仅仅是一个问题,例如拥有用于快速获取和更新的正确数据存储,以分布式方式完成等等。这就是为什么我要寻找一个现成的项目,而不是自己实施。你看过吗?它有可以设置的调度程序。在一个使用Playframework的项目中,我对调度程序进行了一些尝试,但没有达到那样的规模。他们的网站说它可以处理lot1。它无法在进程重启后生存;2.如何将其扩展到数百万个工作岗位?这就是Quartz旨在解决的问题1。你没有提到坚持是一项要求;2.你说有相对较少的工作。很抱歉,但我确实提到了“高可用性”和“数百万个事件/数百万个一次性触发器”。。。