Spring Scheduler не выполняется, если его компонентный класс не внедрен - PullRequest
0 голосов
/ 23 января 2020

Внезапно планировщик перестал работать, и он работает, только 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
}

1 Ответ

1 голос
/ 27 января 2020

Возможно, глобальная инициализация ленивого компонента включена где-то. Чтобы быстро проверить, если это так, попробуйте пометить TriggerScheduler с помощью @Lazy(false). Вы также можете найти свойство spring.main.lazy-initialization=true где-нибудь в Spring Environment.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...