В классе IndexProcessor
вам нужен способ установки флага, который сообщает потоку, который он должен будет завершить, подобно переменной run
, которую вы использовали только в области класса.
Если вы хотите остановить поток, вы устанавливаете этот флаг и вызываете join()
в потоке и ждите его завершения.
Убедитесь, что флаг является потокобезопасным с помощью изменчивой переменной или используя методы геттера и сеттера, которые синхронизируются с переменной, используемой в качестве флага.
public class IndexProcessor implements Runnable {
private static final Logger LOGGER = LoggerFactory.getLogger(IndexProcessor.class);
private volatile boolean running = true;
public void terminate() {
running = false;
}
@Override
public void run() {
while (running) {
try {
LOGGER.debug("Sleeping...");
Thread.sleep((long) 15000);
LOGGER.debug("Processing");
} catch (InterruptedException e) {
LOGGER.error("Exception", e);
running = false;
}
}
}
}
Затем в SearchEngineContextListener
:
public class SearchEngineContextListener implements ServletContextListener {
private static final Logger LOGGER = LoggerFactory.getLogger(SearchEngineContextListener.class);
private Thread thread = null;
private IndexProcessor runnable = null;
@Override
public void contextInitialized(ServletContextEvent event) {
runnable = new IndexProcessor();
thread = new Thread(runnable);
LOGGER.debug("Starting thread: " + thread);
thread.start();
LOGGER.debug("Background process successfully started.");
}
@Override
public void contextDestroyed(ServletContextEvent event) {
LOGGER.debug("Stopping thread: " + thread);
if (thread != null) {
runnable.terminate();
thread.join();
LOGGER.debug("Thread successfully stopped.");
}
}
}
Spring security использует $ 2a $ BCrypt, который генерирует строку пароля длиной 60 символов. Пример: $2a$10$IvpDzjQ3RhFvIECF7r2muOlLsDFywkyGJNEg1q6OudgK9.2vkubfW
, поэтому убедитесь, что в столбце паролей указано char(60)
или varchar(60)
как минимум