Ich benutze Spring und ich möchte wissen, wie Sitzung, Klasse und Methoden funktionieren (wie viele Instanzen einer Klasse habe ich und warum). In meinem Fall habe ich eine Component
Klasse mit einem async
Methode, die eine andere Klasse mit einem ProcessBuilder
innen ruft:Spring und synchronisierte Methode, um eine bestimmte Anzahl von Methodenausführungen gleichzeitig zu garantieren
@Component
@PropertySource(value = { "classpath:application.properties" })
public class ZipAndMat {
.....
......
@Async
public void createZipAndMat(User currentUser, String originalFileName){
conversion(path, name, timeSample, timeout):
}
private void conversion(String path, String name, String timeSample, String timeout) throws Exception {
ProcessBuilder pb = new ProcessBuilder("java", "-XX:-UseParallelGC", "-Xss512k", "-jar", env.getRequiredProperty(PROPERTY_NAME_CONVERSION_PATH), path, name, timeSample, timeout);
pb.inheritIO();
Process p = pb.start();
int error = p.waitFor();
if (error !=0) {
if (p.isAlive()) {
p.destroyForcibly();
}
throw new MCRException("Error with conversion");
}
}
}
Diese Konfiguration mein TaskExecutor ist:
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(100);
executor.setQueueCapacity(100);
executor.initialize();
return executor;
}
Ich möchte die Anzahl der steuern Prozesse, weil sonst der Server untergehen kann. Ich habe mich gefragt, wie ich das erreichen kann, indem ich Synchronisation verwende? Zum Beispiel sollte ich 10 Prozesse ausführen, danach muss andere Anfrage warten, dass mindestens ein Prozess beendet ist. Vielleicht kann eine dumme Lösung eine statische Variable und eine aktive Wartezeit mit einem while(i>10) this.sleep(10000)...
Dank sein
Sie können es nicht mit Synchronisation erreichen, aber Sie können mit einem Zähl-Semaphor von 'java.util.concurrent'. – EJP
Konfigurieren Sie einfach den entsprechenden 'TaskExecutor' und geben Sie ihm eine maximale Anzahl gleichzeitiger Aufgaben, die Sie ausführen möchten. Anstatt zu versuchen, es selbst zu tun. –
@EJP Semaphore scheint sehr interessant, ich lese Dokumentation. – luca