1

有没有办法将 BlockingQueue 传递给 Quartz 框架中的作业?我尝试使用 JobDataMap 来传递 BlockingQueue 但这似乎不起作用。这里是相关的代码片段:

JobDetail job = newJob(Jobby.class)
  .withIdentity("myJob", "group1")
  .usingJobData("buffer", queue)
  .build();

也许有人对如何实现这一目标有想法。

4

1 回答 1

1

看起来您正在尝试实现生产者/消费者设计模式,其中生产者将工作放入队列中,而消费者使用 Quartz 定期检查该队列。这种设计还不错,但是您的实现将无法正常工作。通过将该队列传递给作业数据,Quartz 将对其进行序列化,并在作业触发时将其反序列化。队列不会通过引用传递,而是通过值(副本)传递。如果您意识到 Quartz 应该在分布式环境中工作,这是可以理解的,其中作业被调度并持久化到一个节点上的数据库中,并在另一个节点上反序列化和执行。

话虽如此,您需要重新评估您的实施。如果您不关心集群和分布,请让您的队列以某种方式在全球范围内可用。您的选择是:

我特别推荐使用也是一个不错的选择。但是如果我们在谈论 - 为什么不考虑使用一些轻量级的实现而不是 Quartz?您将避免延迟。

于 2012-06-05T08:02:33.710 回答