У меня есть сервер и клиентское приложение.На стороне сервера, когда я сохраняю сущность в JpaRepository, используя saveAndFlush()
, текущее выполнение потока, в котором этот метод вызывается, блокируется навсегда.Но когда сервер выключается и контекст Spring закрывается, этот объект сохраняется в моей базе данных Derby без проблем.Таким образом, если я хочу продолжить работу на стороне клиента с обновленной БД, мне нужно перезапустить сервер.Это почему?Я думал, что этот метод никогда не блокируется, и он сохраняется и немедленно фиксирует изменения.
Вот код сервера:
@SpringBootApplication
public class Main {
private TermsRepository termsRepository;
private static final int PORT = 16105;
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
public Main(TermsRepository termsRepository) {
this.termsRepository = termsRepository;
try (ServerSocket serverSocket = new ServerSocket(PORT);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(new Server(serverSocket));
executorService.shutdown();
System.out.printf("Local server is launched on port: %d\n", PORT);
System.out.println("To shutdown type \"exit\"");
String line;
while ((line = reader.readLine()) != null)
if (line.equals("exit")) {
serverSocket.close();
break;
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
private class Server implements Runnable {
private ServerSocket serverSocket;
Server(ServerSocket serverSocket) {
this.serverSocket = serverSocket;
}
@Override
public void run() {
ExecutorService es = Executors.newCachedThreadPool();
try {
while (true) {
Socket clientSocket = serverSocket.accept();
es.submit(new ClientWorker(clientSocket));
}
} catch (IOException e) {
} finally {
try {
es.shutdown();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private class ClientWorker implements Runnable {
private Socket clientSocket;
ClientWorker(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
try (ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());
ObjectOutputStream ous = new ObjectOutputStream(clientSocket.getOutputStream())) {
String term = (String) ois.readObject();
String definition = (String) ois.readObject();
Optional<Term> found = termsRepository.findByTerm(term);
if (found.isPresent()) {
Term foundTerm = found.get();
foundTerm.addDefinition(new Definition(definition));
termsRepository.saveAndFlush(foundTerm);
// only goes here when "exit" is typed to console
System.out.println("Saved");
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
termsRepository
здесь расширяется JpaRepository