REFACTOR: storing Process instead of PID

This commit is contained in:
Patrick Haßel 2025-07-30 16:51:28 +02:00
parent a7fdb28ed8
commit f6d5c4ccda
2 changed files with 24 additions and 10 deletions

View File

@ -22,6 +22,12 @@ public class ServerController {
private final ServerService serverService;
@NonNull
@GetMapping("stopAll")
public List<ServerDto> stopAll() {
return serverService.stopAll();
}
@NonNull
@GetMapping("findAll")
public List<ServerDto> findAll() {

View File

@ -25,15 +25,15 @@ public class ServerService {
private final ServerConfig serverConfig;
private final Object lock = new Object();
private final Object serversLock = new Object();
private List<Server> list = new ArrayList<>();
private List<Server> servers = new ArrayList<>();
@PostConstruct
public void startup() {
final File ROOT = new File(serverConfig.getPath());
synchronized (lock) {
list = Arrays.stream(Objects.requireNonNull(ROOT.listFiles())).map(this::_tryLoadingFromDir).filter(Optional::isPresent).map(Optional::get).toList();
synchronized (serversLock) {
servers = Arrays.stream(Objects.requireNonNull(ROOT.listFiles())).map(this::_tryLoadingFromDir).filter(Optional::isPresent).map(Optional::get).toList();
}
}
@ -41,7 +41,7 @@ public class ServerService {
private Optional<Server> _tryLoadingFromDir(@NonNull final File directory) {
try {
final Server server = new Server(directory);
list.stream().filter(server::eq).findFirst().ifPresent(old -> server.process = old.process);
servers.stream().filter(server::eq).findFirst().ifPresent(old -> server.process = old.process);
return Optional.of(server);
} catch (NoMinecraftServer e) {
log.warn(e.getMessage());
@ -65,6 +65,7 @@ public class ServerService {
log.warn("Server is already running: name={}", server.properties.name);
return;
}
stopAll();
log.info("Starting server: name={}", server.properties.name);
final ProcessBuilder builder = new ProcessBuilder("java", "-jar", "server.jar");
builder.directory(server.directory);
@ -129,23 +130,30 @@ public class ServerService {
@NonNull
private Server getByName(@NonNull final String name) {
synchronized (lock) {
return list.stream().filter(server -> server.properties.name.equals(name)).findFirst().orElseThrow();
synchronized (serversLock) {
return servers.stream().filter(server -> server.properties.name.equals(name)).findFirst().orElseThrow();
}
}
@NonNull
public List<ServerDto> findAll() {
synchronized (lock) {
return list.stream().map(ServerDto::new).toList();
synchronized (serversLock) {
return servers.stream().map(ServerDto::new).toList();
}
}
@NonNull
public File getIconFileByName(@NonNull final String name) {
synchronized (lock) {
synchronized (serversLock) {
return getByName(name).iconFile;
}
}
@NonNull
public List<ServerDto> stopAll() {
synchronized (serversLock) {
return servers.stream().peek(this::stop).map(ServerDto::new).toList();
}
}
}