【发布时间】:2016-10-10 09:45:46
【问题描述】:
我正在使用 Spring,我想知道会话、类和方法是如何工作的(我拥有一个类的多少个实例以及为什么)。
在我的例子中,我有一个带有 async 方法的 Component 类,该方法调用另一个内部带有 ProcessBuilder 的类:
@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");
}
}
}
这是我的 TaskExecutor 配置:
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(100);
executor.setQueueCapacity(100);
executor.initialize();
return executor;
}
我想控制进程数,否则服务器可能会宕机。我想知道如何使用同步来实现这一点?例如,我应该执行 10 个进程,之后其他请求必须等待至少一个进程结束。也许一个愚蠢的解决方案可能是一个静态变量和一个while(i>10) this.sleep(10000)...的主动等待
谢谢
【问题讨论】:
-
你不能通过同步来实现它,但是你可以使用来自
java.util.concurrent的计数信号量。 -
只需配置适当的
TaskExecutor并为其提供您希望能够执行的最大并发任务数。而不是自己动手。 -
@EJP 信号量似乎很有趣,我正在阅读文档。
-
@M.Deinum TaskExecutor,如果我理解正确的话,它对我的应用程序中的并发任务很有用,而不是对特定方法有用。我想了解有关 Spring 如何处理用户会话和 TaskExecutor 参数的更多详细信息
标签: java spring multithreading jakarta-ee process