Я создал приложение CLI (используя Spring) для чтения внешних API, сохранения его в базе данных и обработки этих данных.
Для обработки данных я использую проектный реактор (* 1004)* делать вещи параллельно.
Однако я вижу, что Java-процесс не завершается, когда ему приходится выполнять большую работу.
Я обнаружил, чточто процесс останавливается, когда вы запускаете полную сборку мусора (например, с помощью jconsole
).
Так что в этом случае не какой-то поток (созданный мной в приложении) зависает или какой-то странный тупик,но что-то в сборщике мусора.
В основном моя программа делает что-то вроде этого:
public class Runner {
private static Logger logger = LoggerFactory.getLogger(Runner.class);
public static void main(String[] args) {
try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext()) {
run(args, context);
} catch (Throwable t) {
logger.error("error", t);
} finally {
logger.info("closed application context");
}
}
}
, где метод run
вызывает много другого кода (который, я думаю, не очень актуален).
Интересно то, что closed application context
регистрируется, но потом ничего не происходит.
Некоторым грубым решением было бы позвонить System.gc()
и System.exit(0)
в конце, но я 'Надеюсь, есть лучшие (конфигурационные) решения?