#java #spring #spring-boot #cloud-foundry
#java #spring #spring-boot #cloud-foundry
Вопрос:
Я работаю над приложением и развертываю его в cloud foundry. Внутри она имеет 3 пользовательские зависимости, разработанные нашей командой.
Все 3 зависимости являются загрузочным проектом и имеют свои @Configuration
.
- Зависимость 1 заключается во взаимодействии с Couchbase. Источником этой зависимости является boot project.
- Зависимость 2 заключается во взаимодействии с FluentD для ведения журнала. Источником этой зависимости является boot project.
- Зависимость 3 заключается во взаимодействии с внешней службой rest. Источником этой зависимости является boot project.
- Зависимость 4 имеет все вышеперечисленные 3 зависимости, а также несколько классов утилит и констант.
Я использую эту зависимость 4 в нескольких веб-приложениях, которые имеют реализацию WebMVC.
На моем локальном компьютере все работает нормально. Но когда я запускаю это веб-приложение в облаке, иногда библиотеки выполняются перед веб-приложением, которое периодически приводит к сбою моего приложения. Хорошая вещь, приложение восстанавливается за несколько секунд.
Я внес нижеприведенные изменения в свои библиотеки (банки / зависимости) и попробовал в облаке. После внесения этих изменений коэффициент сбоя приложения уменьшается, но, к сожалению, он все еще иногда падает, и я могу видеть, что зависимости выполняются перед приложением.
- Добавлен bootRepackage.enabled = false bootRepackage.С jartask = jar в библиотеке build.gradle
- Удалено из библиотеки и добавлено в мое веб-приложение SpringBoot { MainClass = «com.java .Приложение » исполняемый файл = true }
- Вылетел
@SpringBootApplication
из библиотек (зависимостей / jars). Сейчас это только в моем веб-приложении.
Я не знаю, что это единственные шаги, позволяющие сделать зависимость загрузки неисполняемой, иначе мне пришлось бы сделать что-то еще. Пожалуйста, дайте мне знать, если я чего-то не хватает.
Вот пример отключенного класса приложения одной из моих зависимостей.
import org.springframework.context.annotation.ComponentScan;
@ComponentScan
public class LoggingApplication {
}
Sample of Web application main class.
@SpringBootApplication
@EnableWebMvc
@Import(LoggingApplication.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Комментарии:
1. Что означает «иногда библиотеки выполняются до веб-приложения»? Библиотеки на самом деле не должны ничего выполнять.
2. И, честно говоря, если это внутренние зависимости, а не полноценные приложения, то какого черта вы вообще используете Spring Boot? Обычного фреймворка Spring должно быть достаточно.
Ответ №1:
Вы не предоставили stacktrace и не предоставили никаких подробностей о «сбое». Итак, глядя в мой хрустальный шар, это звучит так, как будто вы выполняете некоторую работу на этапе подключения контейнера Spring IoC. Эту «работу» следует перенести в @PostConstruct
обработчики, чтобы вы были уверены, что она будет выполнена после полного создания и инициализации контекста Spring.