Создание пружинной резьбы с пружиной управляемой резьбы - PullRequest
0 голосов
/ 31 марта 2020

Итак, я пытаюсь научиться весенней загрузке, перенеся мой код 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/, но не смог найти жизнеспособное решение.

1 Ответ

0 голосов
/ 31 марта 2020

Вы можете создать их экземпляр, используя ObjectFactory

@Autowired
private ThreadPoolTaskScheduler taskScheduler;

@Autowired
private ObjectFactory<WorkerThread> threadFactory;

@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 = threadFactory.getObject();
        taskScheduler.scheduleAtFixedRate(wt, interval);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...