【问题标题】:Quartz Job throttling石英作业节流
【发布时间】:2012-11-02 21:06:13
【问题描述】:

有点奇怪的要求:

我有一些作为数据收集者的石英工作,在可用时从不同位置收集数据。然后我有另一个工作 [数据加载] 正在从收集器作业中调用/触发以更新我的数据库。

我的要求是如何限制 Load Job 以仅让两个实例并行运行并处理来自收集器作业的工作

Collector Jobs 1,2,...N > Loader Job(两个实例)

作业程序部署在集群 Tomcat 中。

两个问题: 1) 当 Loader 作业的两个实例已经在进行中时,如何让 Collector 作业等待?有什么方法可以使用石英程序来实现 FIFO 逻辑来限制 Loader 作业的工作?如果一个数据已经在等待处理,我也不希望收集器获取另一个数据。 2)有没有办法只用两个线程运行作业?一次不能超过两个实例处于活动状态?我的数据库表有限制,只能并行运行两个实例。

【问题讨论】:

    标签: concurrency quartz-scheduler jobs throttling


    【解决方案1】:

    8 年后,在搜索工作限制时,该问题在 google 中显示为最高结果。虽然问题中的案例显然要求使用队列,但从未给出实际答案。

    所以...要在石英中节流作业,必须使用 TriggerListener 并在 vetoJobExecution 中实现节流。也可以对作业本身进行注释,以防止使用@DisallowConcurrentExecution 并发执行。

    【讨论】:

      【解决方案2】:

      您似乎在这里遇到了生产者-消费者的情况。 生产者和消费者通常由一个队列分隔。让您的收集器将项目放入(持久?)队列中,并让您的加载器从队列中读取并分派最多 2 个处理线程。

      【讨论】:

      • 这里是生产者-消费者的情况。但目标是避免中间队列,我只想处理我可以从生产者位置处理的内容。这样,生产者就可以知道还有什么等待被拾取。
      • 即使有队列,生产者也可以轮询它以知道那里有东西。如果您需要更多指导,您需要澄清一下您想要实现的目标。
      • 我们有一个应用程序,它有几个独立的 Java 程序(20 多个程序),它们不断地查看输入文件夹。他们拿起文件,然后将它们交给工作线程。只有一个工作程序可用,由于数据库资源上的并发问题,我们只能允许它的两个实例同时运行。我们正在使用 Java 线程来处理对工作线程的限制。我们正在尝试做的是摆脱standalobe程序,并将它们转换为部署在Web服务器上的Quartz批处理程序。此外,我们正在尝试删除集群环境中的线程。
      • 我明白了。您有一个生产者消费者模式的变体,其中生产者不应该是急切的。即只有当有消费者准备好处理它时,它才应该产生数据。为了通过调度机制实现它,您可以让您的消费者调度生产者以按需执行单次执行(而不是定期执行)。话虽如此,我认为这将是对调度机制的滥用。您基本上是在尝试实现异步拉取模式并使用 Quartz 作为消息代理。
      猜你喜欢
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2019-09-08
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多