繁体   English   中英

在Spring中重构这个的最佳方法是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM