У меня есть проект Kotlin, созданный с использованием Spring-Boot 2.6.4 и Java 11. Вот мой основной класс:
@SpringBootApplication
@EnableScheduling
open class MailApplication {
companion object {
@JvmStatic
fun main(vararg args: String) {
runApplication<EcoMailApplication>(*args)
}
}
}
У меня также есть еще один класс для запуска моего приложения с дополнительными конфигурациями:
object LocalRunner {
@JvmStatic
fun main(vararg args: String) {
System.setProperty("spring.profiles.active", "stubMode,DEV,LOCAL")
System.setProperty("logback.configurationFile", "logger/logback.xml")
System.setProperty("logging.config", "classpath:logger/logback.xml")
MailApplication.main(*args)
}
}
Итак, когда я запускаю свое приложение с помощью функции «MailApplication.main», мои запланированные службы работают без каких-либо проблем. Но когда я запускаю приложение с использованием класса «LocalRunner.main», никаких методов, помеченных аннотацией @Scheduled, не запускается. Почему это? Как включить запланированные задания при работе в локальном профиле?
редактировать. структура проекта:
└── com
└── acme
├── LocalRunner.kt
├── MailApplication.kt
Большое спасибо. Теперь я могу исправить ошибку. Я запустил приложение с параметрами и получил ту же ошибку. Затем я удалил параметр «-Dlogging.config», и ошибка исчезла. Похоже, у меня проблемы с настройкой регистратора, которые влияют на планирование. Исправим это и опубликуем решение.
Скорее всего проблема с пакетом. Пожалуйста, обновите свой Вопрос, чтобы сообщить нам пакеты, в которых определены эти два класса.
Spring ищет аннотации в структуре вашего класса только ВНИЗ с момента запуска приложения. Итак, если бы у вас была такая структура:
└── com
└── acme
├── MailApplication.kt
├── local
│ └── LocalRunner.kt
├── model
│ └── MyModel.kt
└── service
└── MyService.kt
... тогда, начиная с MailApplication.kt
, все остальные ваши классы с аннотациями Spring находятся в этом пакете com.acme
или ниже.
Но если вы начнете с com.acme.local.LocalRunner
, то классы с аннотациями Spring, которые вы хотите найти, не будут найдены, поскольку они находятся выше в иерархии классов.
Вы можете переопределить это поведение по умолчанию разными способами, но начните с простого перемещения LocalRunner
в тот же пакет, что и MailApplication
.
Нет. MailApplication и LocalRunner находятся в одном пакете (корень проекта). В любом случае спасибо за предложение.
Глупая ошибка. Мой LocalRunner включает эту строку кода:
System.setProperty("logging.config", "classpath:logger/logback.xml")
и этот файл «logback.xml» устанавливает уровень ведения журнала как «ОШИБКА». Поэтому я не вижу сообщений log.info("..") из запланированного задания. Само приложение работает нормально. Я просто не видел никаких сообщений. ))
Что произойдет, если вы начнете из MailApplication, но установите те же системные свойства другим способом (используя флаги
-D
в командной строке)? (Это должно отличать, вызван ли сбой свойствами или каким-то образом самим LocalRunner.)