Ich muss einen globalen ThreadPoolTaskExecutor in meiner Spring-Anwendung erstellen, die für das Ausführen von Multithread-Aufgaben in meiner Anwendung verantwortlich sein wird.Controlled ThreadPoolExecutor in Java Spring
Allerdings möchte ich für jede Anfrage die Anzahl der verwendeten Threads von diesem globalen ThreadPool begrenzen. Wie soll ich sicherstellen, dass diese Beschränkung pro Anfrage durchgesetzt wird?
Für z.
Ich erstelle einen globalen Thread-Pool mit einer maximalen Poolgröße von 50 Threads. Aber ich möchte die Anzahl der Threads pro Anfrage auf 5 Threads beschränken. Diese 5 Threads konnten jedoch nur aus den 50 Threads zugewiesen werden, die im globalen Thread-Pool in der Konfigurationsdatei verfügbar sind.
Konfigurationsklasse zum Erstellen des Task Executor.
@Configuration
public class ThreadPoolConfiguration {
@Value("${threadpool.corepoolsize}")
int corePoolSize;
@Value("${threadpool.maxpoolsize}")
int maxPoolSize;
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
pool.setCorePoolSize(corePoolSize);
pool.setMaxPoolSize(maxPoolSize);
pool.setWaitForTasksToCompleteOnShutdown(true);
return pool;
}
}
Controller-Klasse
@RestController
public class WebController {
@Autowired
ThreadPoolTaskExecutor threadPool;
@RequestMapping("/process")
public String process(){
String msg = "";
List<Future<String>> futureList = new ArrayList<>();
for(int threadNumber = 0; threadNumber < 5; threadNumber ++){
CallableWorker callableTask = new CallableWorker(String.valueOf(threadNumber));
Future<String> result = threadPool.submit(callableTask);
futureList.add(result);
}
for(Future<String> future: futureList){
try {
msg += future.get() + "#####";
} catch (Exception e){}
}
return msg;
}
}
Haftungsausschluss: Dies ist nur Beispielcode ich von einem blog post bekam.
Wie kann ich ein solches Design implementieren? Ich sehe keinen Sub-Thread-Pool, der erstellt werden kann. Ich möchte auch keinen Thread-Pool für jede Anfrage instanziieren, da dies katastrophal wäre.
Irgendwelche Vorschläge?
Was ist das Verhalten, das Sie wünschen, wenn eine Anfrage beispielsweise 6 Aufgaben hat, aber auf 5 Themen begrenzt ist? Warten Sie, bis eine der ersten 5 Aufgaben abgeschlossen ist, bevor Sie die 6. Aufgabe in die Warteschlange stellen. –
Ja, genau so. Aber sagen Sie, dass eine andere Anfrage mit 5 Aufgaben kommt, geben Sie ihr 5 separate Threads vom globalen Thread-Pool. Und nachdem die zwei Anfragen eingereicht wurden, sind 10 Threads aus dem globalen Pool belegt und 1 Task wartet noch (von der ersten Anfrage) – Amriteya