Skip to content

Commit

Permalink
fix($Quartz): correct StackOverflowError from inappropriate Hutool …
Browse files Browse the repository at this point in the history
…usage
  • Loading branch information
johnnymillergh committed Apr 15, 2022
1 parent 1021551 commit ae086dc
Show file tree
Hide file tree
Showing 15 changed files with 433 additions and 501 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import cn.hutool.core.text.CharSequenceUtil
import cn.hutool.core.util.RandomUtil
import cn.hutool.core.util.StrUtil
import cn.hutool.extra.validation.ValidationUtil
import com.baomidou.mybatisplus.extension.kotlin.KtQueryChainWrapper
import com.baomidou.mybatisplus.extension.plugins.pagination.Page
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
import com.fasterxml.jackson.databind.ObjectMapper
Expand Down Expand Up @@ -68,11 +67,10 @@ class RoleDomainServiceImpl(

override fun checkAdmin(roleIdList: @NotEmpty List<Long>): Boolean {
// If roleNameSet is not empty (contains "admin")
return this.list(
KtQueryChainWrapper(getBaseMapper(), Role::class.java)
.select(Role::name)
.`in`(Role::id, roleIdList)
)
return this.ktQuery()
.select(Role::name)
.`in`(Role::id, roleIdList)
.list()
.stream()
.map { item -> item.name }
.anyMatch { roleName: String ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import cn.hutool.json.JSONUtil
import com.baomidou.mybatisplus.core.metadata.OrderItem
import com.baomidou.mybatisplus.core.toolkit.Wrappers
import com.baomidou.mybatisplus.core.toolkit.support.SFunction
import com.baomidou.mybatisplus.extension.kotlin.KtQueryChainWrapper
import com.baomidou.mybatisplus.extension.plugins.pagination.Page
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
import com.jmsoftware.maf.authcenter.security.service.JwtService
Expand Down Expand Up @@ -71,9 +70,7 @@ class UserDomainServiceImpl(
if (hasKey) {
return JSONUtil.toBean(redisTemplate.opsForValue()[key], GetUserByLoginTokenResponse::class.java)
}
val wrapper = KtQueryChainWrapper(getBaseMapper(), User::class.java)
wrapper.eq(User::username, loginToken)
val user = getBaseMapper().selectOne(wrapper)
val user = this.ktQuery().eq(User::username, loginToken).one()
if (ObjectUtil.isNull(user)) {
return null
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.jmsoftware.maf.authcenter.user.service.impl

import com.baomidou.mybatisplus.extension.kotlin.KtQueryChainWrapper
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
import com.jmsoftware.maf.authcenter.role.persistence.Role
import com.jmsoftware.maf.authcenter.role.service.RoleDomainService
Expand All @@ -26,11 +25,9 @@ class UserRoleDomainServiceImpl(
) : ServiceImpl<UserRoleMapper, UserRole>(), UserRoleDomainService {
override fun assignRoleByRoleName(user: User, roleName: String) {
val role = Optional.ofNullable(
roleDomainService.getOne(
KtQueryChainWrapper(roleDomainService.baseMapper, Role::class.java)
.select(Role::id)
.eq(Role::name, roleName)
)
roleDomainService.ktQuery()
.select(Role::id)
.eq(Role::name, roleName).one()
).orElseThrow { InternalServerException("Cannot find the role: $roleName") }
val userRole = UserRole()
userRole.userId = user.id
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.jmsoftware.maf.springcloudstarter.quartz

import com.jmsoftware.maf.common.util.logger
import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties
import com.jmsoftware.maf.springcloudstarter.quartz.annotation.QuartzSchedulable
import org.springframework.stereotype.Component

/**
* Description: GreetingBean, demo for dynamic Quartz job, which is configured in the table `quartz_job_configuration`.
*
* @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 7/13/2021 10:16 PM
* @see [Quartz Scheduler](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html.features.quartz)
*/
@Component("greetingBean")
class GreetingBean(
private val mafProjectProperties: MafProjectProperties
) {
companion object {
val log = logger()
}

@QuartzSchedulable
@Suppress("unused")
fun hello() {
log.info(
"Greeting from Quartz job, current service is: {}",
mafProjectProperties!!.projectArtifactId
)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.jmsoftware.maf.springcloudstarter.quartz

import com.jmsoftware.maf.common.util.logger
import com.jmsoftware.maf.springcloudstarter.property.MafProjectProperties
import com.jmsoftware.maf.springcloudstarter.quartz.controller.QuartzJobConfigurationController
import com.jmsoftware.maf.springcloudstarter.quartz.service.QuartzJobConfigurationService
import com.jmsoftware.maf.springcloudstarter.quartz.service.impl.QuartzJobConfigurationServiceImpl
import org.quartz.Scheduler
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration
import org.springframework.boot.autoconfigure.quartz.QuartzProperties
import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.scheduling.quartz.SchedulerFactoryBean
import org.springframework.transaction.PlatformTransactionManager
import java.util.*

/**
* # QuartzConfiguration
*
* Description: QuartzConfiguration, change description here.
*
* @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 4/15/22 7:19 PM
* @see QuartzAutoConfiguration
*/
@ConditionalOnClass(Scheduler::class, SchedulerFactoryBean::class, PlatformTransactionManager::class)
class QuartzConfiguration(
private val mafProjectProperties: MafProjectProperties
) {
companion object {
private val log = logger()
}

@Bean
fun schedulerFactoryBeanCustomizer(quartzProperties: QuartzProperties): SchedulerFactoryBeanCustomizer {
val cpuCoreCount = Runtime.getRuntime().availableProcessors()
val threadCount = (2 * cpuCoreCount).toString()
quartzProperties.properties[SchedulerFactoryBean.PROP_THREAD_COUNT] = threadCount
return SchedulerFactoryBeanCustomizer { schedulerFactoryBean: SchedulerFactoryBean ->
schedulerFactoryBean.setQuartzProperties(asProperties(quartzProperties.properties))
log.warn("Quartz thread pool enhanced by current cpuCoreCount: $cpuCoreCount, threadCount: $threadCount")
schedulerFactoryBean.setSchedulerName("${mafProjectProperties.projectArtifactId}-quartz-scheduler")
schedulerFactoryBean.setWaitForJobsToCompleteOnShutdown(true)
schedulerFactoryBean.setBeanName("schedulerFactoryBean")
}
}

private fun asProperties(source: Map<String, String>): Properties {
val properties = Properties()
properties.putAll(source)
return properties
}

@Bean
fun greetingBean(): GreetingBean {
log.warn("Initial bean: `${GreetingBean::class.java.simpleName}`")
return GreetingBean(mafProjectProperties)
}

@Bean
fun quartzJobConfigurationController(
quartzJobConfigurationService: QuartzJobConfigurationService
): QuartzJobConfigurationController {
log.warn("Initial bean: `${QuartzJobConfigurationController::class.java.simpleName}`")
return QuartzJobConfigurationController(quartzJobConfigurationService)
}

@Bean
fun quartzJobConfigurationService(schedulerFactoryBean: SchedulerFactoryBean): QuartzJobConfigurationService {
log.warn("Initial bean: `${QuartzJobConfigurationServiceImpl::class.java.simpleName}`")
return QuartzJobConfigurationServiceImpl(schedulerFactoryBean, mafProjectProperties)
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.jmsoftware.maf.springcloudstarter.quartz.job

import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration
import com.jmsoftware.maf.springcloudstarter.quartz.util.QuartzJobInvocationUtil
import com.jmsoftware.maf.springcloudstarter.quartz.util.invokeMethod
import org.quartz.DisallowConcurrentExecution
import org.quartz.JobExecutionContext

Expand All @@ -13,6 +13,6 @@ import org.quartz.JobExecutionContext
@DisallowConcurrentExecution
class QuartzDisallowConcurrentExecution : AbstractQuartzJob() {
override fun invoke(context: JobExecutionContext, quartzJobConfiguration: QuartzJobConfiguration) {
QuartzJobInvocationUtil.invokeMethod(quartzJobConfiguration)
invokeMethod(quartzJobConfiguration)
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.jmsoftware.maf.springcloudstarter.quartz.job

import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration
import com.jmsoftware.maf.springcloudstarter.quartz.util.QuartzJobInvocationUtil
import com.jmsoftware.maf.springcloudstarter.quartz.util.invokeMethod
import org.quartz.JobExecutionContext

/**
Expand All @@ -13,6 +13,6 @@ import org.quartz.JobExecutionContext
*/
class QuartzJobExecution : AbstractQuartzJob() {
override fun invoke(context: JobExecutionContext, quartzJobConfiguration: QuartzJobConfiguration) {
QuartzJobInvocationUtil.invokeMethod(quartzJobConfiguration)
invokeMethod(quartzJobConfiguration)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.jmsoftware.maf.springcloudstarter.quartz.service.impl
import cn.hutool.core.text.CharSequenceUtil
import cn.hutool.core.util.ReflectUtil
import cn.hutool.extra.validation.ValidationUtil
import com.baomidou.mybatisplus.extension.kotlin.KtQueryChainWrapper
import com.baomidou.mybatisplus.extension.plugins.pagination.Page
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
import com.jmsoftware.maf.common.bean.PageResponseBodyBean
Expand All @@ -19,8 +18,9 @@ import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfiguratio
import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration
import com.jmsoftware.maf.springcloudstarter.quartz.repository.QuartzJobConfigurationMapper
import com.jmsoftware.maf.springcloudstarter.quartz.service.QuartzJobConfigurationService
import com.jmsoftware.maf.springcloudstarter.quartz.util.CronUtil
import com.jmsoftware.maf.springcloudstarter.quartz.util.ScheduleUtil
import com.jmsoftware.maf.springcloudstarter.quartz.util.createScheduleJob
import com.jmsoftware.maf.springcloudstarter.quartz.util.getJobKey
import com.jmsoftware.maf.springcloudstarter.quartz.util.validateCronExp
import org.quartz.JobDataMap
import org.quartz.Scheduler
import org.springframework.scheduling.quartz.SchedulerFactoryBean
Expand Down Expand Up @@ -55,7 +55,7 @@ class QuartzJobConfigurationServiceImpl(
scheduler.clear()
val jobList: List<QuartzJobConfiguration> = getQuartzJobConfigurationForInitialization()
for (quartzJobConfiguration in jobList) {
ScheduleUtil.createScheduleJob(
createScheduleJob(
scheduler,
quartzJobConfiguration,
mafProjectProperties.projectArtifactId
Expand All @@ -66,11 +66,10 @@ class QuartzJobConfigurationServiceImpl(
}

private fun getQuartzJobConfigurationForInitialization(): List<QuartzJobConfiguration> {
return this.list(
KtQueryChainWrapper(baseMapper, QuartzJobConfiguration::class.java)
.eq(QuartzJobConfiguration::serviceName, mafProjectProperties.projectArtifactId)
.orderByAsc(QuartzJobConfiguration::createdTime)
)
return this.ktQuery()
.eq(QuartzJobConfiguration::serviceName, mafProjectProperties.projectArtifactId)
.orderByAsc(QuartzJobConfiguration::createdTime)
.list()
}

override fun getPageList(
Expand Down Expand Up @@ -122,7 +121,7 @@ class QuartzJobConfigurationServiceImpl(
}

private fun validateCronExpression(cronExpression: String) {
requireTrue(CronUtil.isValid(cronExpression)) { valid: Boolean ->
requireTrue(validateCronExp(cronExpression)) { valid: Boolean ->
logger.warn("Cron validation: $valid, expression: $cronExpression")
}.orElseThrow { IllegalArgumentException("Cron($cronExpression) invalid") }
}
Expand Down Expand Up @@ -170,7 +169,7 @@ class QuartzJobConfigurationServiceImpl(
val jobDataMap = JobDataMap()
jobDataMap[QUARTZ_JOB_CONFIGURATION] = quartzJobConfiguration
scheduler.triggerJob(
ScheduleUtil.getJobKey(
getJobKey(
quartzJobConfiguration.id!!,
quartzJobConfiguration.group!!,
mafProjectProperties.projectArtifactId
Expand All @@ -188,7 +187,7 @@ class QuartzJobConfigurationServiceImpl(
}.orElseThrow { IllegalStateException(CharSequenceUtil.format("Failed to delete Quartz job configuration")) }
val scheduler: Scheduler = schedulerFactoryBean.scheduler
val deletedJob = scheduler.deleteJob(
ScheduleUtil.getJobKey(id, group, mafProjectProperties.projectArtifactId)
getJobKey(id, group, mafProjectProperties.projectArtifactId)
)
requireTrue(deletedJob) { deletedJob1: Boolean ->
logger.warn("Scheduler deleted job and related triggers: $deletedJob1")
Expand Down
Loading

0 comments on commit ae086dc

Please sign in to comment.