Блоки Spring JpaRepository для метода saveAndFlush () - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть сервер и клиентское приложение.На стороне сервера, когда я сохраняю сущность в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...