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; private final ServerService serverService;
@NonNull
@GetMapping("stopAll")
public List<ServerDto> stopAll() {
return serverService.stopAll();
}
@NonNull @NonNull
@GetMapping("findAll") @GetMapping("findAll")
public List<ServerDto> findAll() { public List<ServerDto> findAll() {

View File

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