首页 > 解决方案 > 如何使用 XML 在 Spring 中创建执行器服务 bean

问题描述

我必须ScheduledThreadPoolExecutor在用 XML 编写的 Spring 配置文件中创建一个 bean。在Java中,我会把它写成

@Bean(name = "MyThreadPoolList")
    public List<ScheduledThreadPoolExecutor> executorList() {
        List<ScheduledThreadPoolExecutor> executor = new ArrayList<>();
        ScheduledThreadPoolExecutor tempExecutor;
        for (int i = 0; i< 3; i++ ){
            tempExecutor = new ScheduledThreadPoolExecutor(
                    1,
                    NamingThreadFactory.createWithDaemon("ExecutorPool-"+i+"-Thread-%d", true));
            tempExecutor.prestartAllCoreThreads();
            executor.add(i, tempExecutor);
        }
        return Collections.unmodifiableList(executor);
    }

但我不知道在 XML 中实现这一目标的最佳方法是什么。我可以尝试以下方法:

<bean id="MyThreadPoolList" class="java.util.ArrayList">
    <constructor-arg>
        <list>
            <bean class="java.util.concurrent.ScheduledThreadPoolExecutor" init-method="prestartAllCoreThreads">
                 <constructor-arg value="1"/>
                 <constructor-arg>
                     <bean class="my.factory.NamingThreadFactory" factory-method="createWithDaemon">
                           <constructor-arg value="ExecutorPool-0-Thread-%d"/>
                           <constructor-arg type="boolean" value="true"/>
                     </bean>
                </constructor-arg>
            </bean>
            <bean class="java.util.concurrent.ScheduledThreadPoolExecutor" init-method="prestartAllCoreThreads">
                 <constructor-arg value="1"/>
                 <constructor-arg>
                     <bean class="my.factory.NamingThreadFactory" factory-method="createWithDaemon">
                           <constructor-arg value="ExecutorPool-1-Thread-%d"/>
                           <constructor-arg type="boolean" value="true"/>
                     </bean>
                </constructor-arg>
            </bean>
            <bean class="java.util.concurrent.ScheduledThreadPoolExecutor" init-method="prestartAllCoreThreads">
                 <constructor-arg value="1"/>
                 <constructor-arg>
                     <bean class="my.factory.NamingThreadFactory" factory-method="createWithDaemon">
                           <constructor-arg value="ExecutorPool-2-Thread-%d"/>
                           <constructor-arg type="boolean" value="true"/>
                     </bean>
                </constructor-arg>
            </bean>
        </list>
    </constructor-arg>
</bean>

但问题是:

  1. 有太多重复的代码和
  2. 如果将来我想将执行器服务的数量增加到 500,我将不得不复制这 500 次。

有没有更优雅的方法来实现这一点?

标签: javaxmlspring

解决方案


推荐阅读