在Quartz的JobDataMap中传递BlockingQueue

时间:2012-06-04 12:02:21

标签: java quartz-scheduler blockingqueue

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

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

也许有人知道如何实现这一目标。

1 个答案:

答案 0 :(得分:1)

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

据说你需要重新评估你的实施。如果您不关心群集和分发,请使您的队列以某种方式全局可用。您的选择是:

  • 全球 - 请不要
  • 资源可通过
  • 获取
  • bean注入生产者和工作类(Spring支持Quartz)
  • ...

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