Итак, я пытаюсь научиться весенней загрузке, перенеся мой код java в весеннюю загрузку.
У меня есть часть кода Java, подобная этой:
int threadLimit = 5, interval = 2;
ScheduledExecutorService ses = Executors.newScheduledThreadPool(threadLimit);
for (int i = 0; i < executionThreadLimit; i++) {
WorkerThread worker = new WorkerThread("WorkerThread");
ses.scheduleAtFixedRate(worker, 0, interval, TimeUnit.SECONDS);
}
Здесь WorkerThread
реализует Runnable
;
Соответствующая альтернатива загрузки Spring вышеприведенного кода:
Класс пользовательского пула:
@Configuration
public class Test {
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(5);
threadPoolTaskScheduler.setThreadNamePrefix("ThreadPoolTaskScheduler");
return threadPoolTaskScheduler;
}
}
Класс WorkerThread:
@Component
@Scope("prototype")
public class WorkerThread implements Runnable {
private Logger logger = LogManager.getLogger(this.getClass().getName());
private String threadName = null;
@Autowired
private AppParameter app;
@Override
public void run() {
logger.info("Thread :: " + this + " is running -- > " + app.getA() + " && " + app.getB());
}
}
Тестовый класс:
@Component
public class TestCommandLineRunner implements CommandLineRunner {
private final Logger logger = LogManager.getLogger(this.getClass().getName());
@Autowired
private ThreadPoolTaskScheduler taskScheduler;
@Override
public void run(String... args) throws Exception {
int threadLimit = 5, interval = 2000; // these 2 are dynamic values but provided statically for testing purposes
for(int i = 0; i< threadLimit; i++) {
WorkerThread wt = new WorkerThread();
taskScheduler.scheduleAtFixedRate(wt, interval);
}
}
}
Теперь вот моя проблема. Если мне нужно запустить 5 WorkerThread
экземпляров, я должен сделать WorkerThread wt = new WorkerThread();
Но если сделать это таким образом, то WorkerThread
больше не будет бобом с пружинным управлением.
Так что мой вопрос как я могу создать пул потоков с классом потока, являющимся bean-компонентом Spring Managed?
Я только начал работать с весенней загрузкой, поэтому кто-то может помочь мне? Спасибо.
Я уже ссылался на следующие документы: https://www.baeldung.com/spring-task-scheduler https://mkyong.com/spring/spring-and-java-thread-example/, но не смог найти жизнеспособное решение.