在我的 Web 应用程序中,我有一个后台服务。该服务使用 Generator 类,该类包含一个 Engine 类和一个ExecutorService
配置为使用多个线程并接受 GeneratorTasks 的类。
@Component
public class Generator {
@Autowired
private Engine heavyEngine;
private ExecutorService exec = Executors.newFixedThreadPool(3);
//I actually pass the singleton instance Generator class into the task.
public void submitTask(TaskModel model, TaskCallback callback) {
this.exec.submit(new GeneratorTask(model, this, callback));
}
}
@Component
public class Engine {
public Engine() {
//time-consuming initialization code here
}
}
public class GeneratorTask implements Callable<String> {
public GeneratorTask(TaskModel m, Generator g, ReceiptCallback c) {
this.m = m;
this.generator = g;
this.c = c;
}
public String call() throws Exception {
//This actually calls the Engine class of the generator.
//Maybe I should have passed the Engine itself?
this.generator.runEngine(c);
}
}
Engine 类需要很长时间来初始化,所以我希望每个线程只初始化一次。我不能只将其设为单例实例,因为该实例不能在多个线程之间共享(它依赖于顺序处理)。不过,在处理任务完成后重用实例是完全可以的。
我正在考虑将private Engine heavyEngine
变量设为 ThreadLocal 变量。但是,我也是 Spring 的新手,所以我想知道是否有另一种方法可以使用 Spring 注释注入 ThreadLocal 变量。我已经研究过将 bean 范围限定为request
范围,但我不确定鉴于我的设计我应该如何去做。
任何有关如何改进我的设计的指导将不胜感激。