我有以下设计:
有一个任务扩展了TimerTask
,并且计划每分钟运行一次。
此任务将尝试从中央队列(作为单个消费者)获取项目并将其表示形式写入文件中。
此外,还有多个生产者不时将项目放入中央队列。
我感兴趣的是,每次执行任务(执行 run() 方法)时,如果有项目,它将从队列中提取所有项目,如果有没有任何项目不执行任何操作。
如果队列已满,生产者应该在队列上 hibernate 。
我对这个问题的解决方案是:
创建扩展 TimerTask 的 ExtractTask。 ExtractTask 将包含一个 BlockingQueue。 每个生产者将通过执行 getQueue() 方法接收对队列实例的引用。 生产者将执行 BlockingQueue.put() 方法。 消费者将在 run() 中执行 BlockingQueue.poll() 方法。
你能提出更好的设计吗?我的设计是否包含任何有问题的场景案例?此设计可能会遇到任何同步问题吗?
最佳答案
我愿意:
- 将队列与设计中的任务分开,
- 注入(inject)队列而不是进行查找,
- 使用 SchedulerService 而不是 TimerTask
除此之外,你已经得到了它。
如果您愿意冒依赖 Spring 的风险,您应该查看 Spring Integration 。您描述的所有组件都在那里。您还可以使用许多其他框架来解决问题,例如 Camel 或 Akka;我的主要观点是,如果不是绝对必要的话,不要自己维护此代码。
免责声明:我有点biased about Spring Integration
关于Java TimerTask 应该等待阻塞队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13014115/