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

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


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

最佳答案

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

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


全局singleton-请,否
可通过jndi获得的资源
spring bean注入了生产者和工作类(Spring很好地支持了Quartz)
...


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

09-04 23:30