Внезапно планировщик перестал работать, и он работает, только TriggerScheduler внедряется в другой компонент.
Если он не внедрен, он даже не появляется на конечных точках IntelliJ -> Beans -> Application, поэтому триггеры не выполняются, потому что я думаю, что bean-компонент не создан. Ни в этом случае не создаются экземпляры ProjectFormTriggerExecutor, ProjectTriggerExecutor, DistrictTriggerExecutor и AreaMonitoringFragmentTriggerExecutor.
Назначение компонента состоит в том, чтобы асинхронно инициировать триггеры PostgreSQL, есть еще один триггер, который просто устанавливает true, когда выполняется истинное условие, отмеченное для forUpdate =.
Все работает нормально, когда я, фиктивная, вставляю его в другой компонент.
Почему это происходит? Есть ли какая-то весенняя конфигурация, которую кто-то из моей команды изменил, чтобы не создавать неинъекционные бины или что-то в этом роде?
@file:Suppress("JpaQlInspection")
package com.gilbertjolly.ulsi.mgmt.application
import com.gilbertjolly.lib.crud.CrudEntity
import com.gilbertjolly.lib.crud.RecalculationPeriod
import com.gilbertjolly.lib.crud.request_util.newTransaction
import com.gilbertjolly.ulsi.mgmt.feature.model.country.District
import com.gilbertjolly.ulsi.mgmt.feature.model.metrics.entities.AreaMonitoringFragment
import com.gilbertjolly.ulsi.mgmt.feature.model.monitoring.forms.ProjectForm
import com.gilbertjolly.ulsi.mgmt.feature.model.org.Project
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.core.env.Environment
import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Component
import org.springframework.transaction.PlatformTransactionManager
import java.time.Instant
import java.util.logging.Logger
import javax.persistence.EntityManager
import kotlin.reflect.KClass
@Component
abstract class ScheduledTriggerExecutor {
@Autowired
lateinit var txManager: PlatformTransactionManager
@Autowired
lateinit var entityManager: EntityManager
val recalculationPeriod: RecalculationPeriod get() = RecalculationPeriod.EVERY_MINUTE
val logger = Logger.getLogger("TriggerRecalculationLog")!!
abstract val entityClass: KClass<out CrudEntity>
fun executeTrigger() {
val startMilliseconds = Instant.now().toEpochMilli()
txManager.newTransaction {
entityManager.createQuery("UPDATE ${entityClass.simpleName} SET markedForUpdate = FALSE WHERE markedForUpdate = TRUE")
.executeUpdate()
}
val triggerExecutionMilliseconds = Instant.now().minusMillis(startMilliseconds).toEpochMilli()
if (triggerExecutionMilliseconds > 5000) logger.warning("Trigger execution of ${entityClass.simpleName} took ${triggerExecutionMilliseconds / 1000.0f}")
}
}
@Component
class TriggerScheduler(val env: Environment,
val txManager: PlatformTransactionManager,
val scheduledTriggerExecutors: List<ScheduledTriggerExecutor>) {
@Scheduled(cron = "0 1 1 * * ?")
fun everyNightAt101() {
performRecalculation(RecalculationPeriod.AT_NIGHT)
}
@Scheduled(cron = "0 1 * * * ?")
fun everyHour() {
performRecalculation(RecalculationPeriod.HOURLY)
}
@Scheduled(cron = "0 0/30 * * * ?")
fun every30Minutes() {
performRecalculation(RecalculationPeriod.EVERY_HALF_AN_HOUR)
}
@Scheduled(cron = "0 0/2 * * * ?")
fun every2Minutes() {
performRecalculation(RecalculationPeriod.EVERY_TWO_MINUTES)
}
@Scheduled(cron = "0 0/1 * * * ?")
fun everyMinute() {
performRecalculation(RecalculationPeriod.EVERY_MINUTE)
}
fun performRecalculation(recalculationPeriod: RecalculationPeriod) {
scheduledTriggerExecutors
.filter { it.recalculationPeriod == recalculationPeriod }
.forEach { it.executeTrigger() }
}
}
@Component
class ProjectFormTriggerExecutor : ScheduledTriggerExecutor() {
override val entityClass = ProjectForm::class
}
@Component
class ProjectTriggerExecutor : ScheduledTriggerExecutor() {
override val entityClass = Project::class
}
@Component
class DistrictTriggerExecutor : ScheduledTriggerExecutor() {
override val entityClass = District::class
}
@Component
class AreaMonitoringFragmentTriggerExecutor : ScheduledTriggerExecutor() {
override val entityClass = AreaMonitoringFragment::class
}