[英]Best way to refactor this in Spring?
private final ExecutorService executorParsers = Executors.newFixedThreadPool(10);
public void parse(List<MyObjInt> objs) {
//... bunch of elided stuff ....
CompletionService<AsupParseObj> parserService = new ExecutorCompletionService<AsupParseObj>(executorParsers);
for (final AsupStoreObj obj : objs) {
parserService.submit(new ParseThread(obj));
}
}
我想DI“ParseThread”但肯定有一个更好的方法来做到这一点,而不是在原型范围内的bean上调用getBean,因为我是Spring的新手,我想我会问......
以下是使用lookup-method
的完整配置(参见3.4.6.1查找方法注入 ):
<bean id="executorParsers" class="java.util.concurrent.Executors"
factory-method="newFixedThreadPool"
destroy-method="shutdownNow">
<constructor-arg value="10"/>
</bean>
<bean id="parserService" class="java.util.concurrent.CompletionService">
<constructor-arg ref="executorParsers"/>
</bean>
<bean id="foo" class="Foo">
<lookup-method name="createThread" bean="parseThread"/>
</bean>
<bean id="parseThread" class="ParseThread" scope="prototype" lazy-init="true"/>
和Java代码:
abstract class Foo {
@Autowired
CompletionService parserService;
protected abstract ParseThread createThread();
public void parse(List<MyObjInt> objs) {
for (final AsupStoreObj obj : objs) {
ParseThread t = createThread();
t.setObject(obj);
parserService.submit(t);
}
}
}
遗憾的是,你无法将任何参数传递给lookup-method
(参见SPR-7431和我的文章使用lookup-method按需创建原型Spring bean ),因此需要人工setObject()
。
如果你不喜欢abstract
方法/类,查找方法可以是非抽象的无操作方法或(更好)默认实现可以抛出异常。 Spring将在运行时覆盖实现,有效地为您调用getBean()
。
额外奖励:我Executor
/ CompletionService
翻译为Spring托管bean。 请注意,Spring支持这些开箱即用的功能: 任务执行和调度 。
好吧,我不确定你认为Spring会在这里给你买什么,但我会注入一个吐出Runnable
/ Callable
的工厂。
private final ExecutorService executorParsers = Executors.newFixedThreadPool(10);
@Autowired
private CallableFactory myCallableFactory = new MyCallableFactory(); //create this factory
public void parse(List<MyObjInt> objs) {
//... bunch of elided stuff ....
CompletionService<AsupParseObj> parserService = new ExecutorCompletionService<AsupParseObj>(executorParsers);
for (final AsupStoreObj obj : objs) {
parserService.submit(myCallableFactory.createCallable(obj));
}
}
您也可以使用Spring注入ExecutorService
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.