Мне нужно создать bean-компонент ScheduledThreadPoolExecutor в файле конфигурации Spring, написанном на XML. В 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>
Но вот проблемы:
Есть ли более элегантный способ добиться этого?
Мысль о том, чтобы иметь 500 исполнителей, каждый со своим собственным пулом потоков, звучит подозрительно ...
Я не уверен, что понимаю ваше предложение. У вас есть какой-нибудь пример? 500 исполнителей, наверное, никогда не потребуются. Максимум, я поднимусь до 10. Прямо сейчас я просто пытаюсь немного улучшить, сделав минимальное количество изменений в кодовой базе. Если мне когда-нибудь придется перейти на 500, код придется отредактировать.




Вам не обязательно хранить свой код в файлах конфигурации XML, верно? Даже если вы начнете с конфигурации XML, вы можете переключиться на контекст приложения с поддержкой аннотаций и добавить тег context: component-scan в свой XML-файл - и вы можете сохранить эту часть своей конфигурации, как и в Java. конфиг ...