From f760fbd3caea7816c92d0a930ac09c175902272b Mon Sep 17 00:00:00 2001 From: JSoi Date: Sun, 31 Jul 2022 07:09:13 +0900 Subject: [PATCH] =?UTF-8?q?#45=20[Add]=20ShedLock=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 +++ .../mpnp/baechelin/BaechelinApplication.java | 2 ++ .../config/SchedulerConfiguration.java | 23 +++++++++++++++++++ .../repository/StoreQueryRepository.java | 10 +++++++- .../baechelin/store/service/StoreService.java | 5 ++++ 5 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/mpnp/baechelin/config/SchedulerConfiguration.java diff --git a/build.gradle b/build.gradle index bad63db..78d4aa7 100644 --- a/build.gradle +++ b/build.gradle @@ -72,6 +72,9 @@ dependencies { //file upload implementation 'commons-fileupload:commons-fileupload:1.4' compile 'commons-io:commons-io:2.11.0' + //scheduler dependency + implementation 'net.javacrumbs.shedlock:shedlock-spring:4.36.0' + implementation 'net.javacrumbs.shedlock:shedlock-provider-jdbc-template:4.36.0' } tasks.named('test') { diff --git a/src/main/java/com/mpnp/baechelin/BaechelinApplication.java b/src/main/java/com/mpnp/baechelin/BaechelinApplication.java index 4c559f9..f8813d3 100644 --- a/src/main/java/com/mpnp/baechelin/BaechelinApplication.java +++ b/src/main/java/com/mpnp/baechelin/BaechelinApplication.java @@ -2,6 +2,7 @@ import com.mpnp.baechelin.common.properties.AppProperties; import com.mpnp.baechelin.common.properties.CorsProperties; +import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; @@ -17,6 +18,7 @@ AppProperties.class }) @EnableScheduling +@EnableSchedulerLock(defaultLockAtMostFor = "PT30S") @SpringBootApplication(exclude = {SecurityAutoConfiguration.class}) @PropertySources({@PropertySource("classpath:application-key.properties")}) public class BaechelinApplication { diff --git a/src/main/java/com/mpnp/baechelin/config/SchedulerConfiguration.java b/src/main/java/com/mpnp/baechelin/config/SchedulerConfiguration.java new file mode 100644 index 0000000..f459744 --- /dev/null +++ b/src/main/java/com/mpnp/baechelin/config/SchedulerConfiguration.java @@ -0,0 +1,23 @@ +package com.mpnp.baechelin.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; +import net.javacrumbs.shedlock.core.LockProvider; +import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider; + +import javax.sql.DataSource; + + +@Configuration +public class SchedulerConfiguration { + @Bean + public LockProvider lockProvider(DataSource dataSource) { + return new JdbcTemplateLockProvider( + JdbcTemplateLockProvider.Configuration.builder() + .withJdbcTemplate(new JdbcTemplate(dataSource)) + .usingDbTime() + .build() + ); + } +} diff --git a/src/main/java/com/mpnp/baechelin/store/repository/StoreQueryRepository.java b/src/main/java/com/mpnp/baechelin/store/repository/StoreQueryRepository.java index bd4dec6..12bc858 100644 --- a/src/main/java/com/mpnp/baechelin/store/repository/StoreQueryRepository.java +++ b/src/main/java/com/mpnp/baechelin/store/repository/StoreQueryRepository.java @@ -1,18 +1,26 @@ package com.mpnp.baechelin.store.repository; +import com.mpnp.baechelin.bookmark.domain.Bookmark; +import com.mpnp.baechelin.bookmark.domain.QBookmark; import com.mpnp.baechelin.common.QueryDslSearch; import com.mpnp.baechelin.common.QuerydslLocation; import com.mpnp.baechelin.review.domain.Review; import com.mpnp.baechelin.store.domain.QStore; import com.mpnp.baechelin.store.domain.Store; +import com.mpnp.baechelin.store.dto.StoreCardResponseDto; +import com.mpnp.baechelin.user.domain.QUser; +import com.mpnp.baechelin.user.domain.User; import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.QueryFactory; import com.querydsl.core.Tuple; import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.NumberPath; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.extern.slf4j.Slf4j; +import org.hibernate.criterion.Projection; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -23,6 +31,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import static com.mpnp.baechelin.common.QuerydslLocation.locTwoPointAndConditions; @@ -149,5 +158,4 @@ public List searchStores(String sido, String sigungu, String keyword, Pag .offset(pageable.getOffset()) .fetch(); } - } diff --git a/src/main/java/com/mpnp/baechelin/store/service/StoreService.java b/src/main/java/com/mpnp/baechelin/store/service/StoreService.java index 44fdc37..a1f8c53 100644 --- a/src/main/java/com/mpnp/baechelin/store/service/StoreService.java +++ b/src/main/java/com/mpnp/baechelin/store/service/StoreService.java @@ -18,6 +18,8 @@ import com.mpnp.baechelin.user.repository.UserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; +import net.javacrumbs.shedlock.spring.annotation.SchedulerLock; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.scheduling.annotation.EnableScheduling; @@ -36,6 +38,7 @@ @Transactional @RequiredArgsConstructor @EnableScheduling +@EnableSchedulerLock(defaultLockAtMostFor = "PT10S") @Slf4j public class StoreService { @@ -229,6 +232,8 @@ public List searchStores(String sido, String sigungu, Stri } @Scheduled(cron = "0 0 0-23 * * *") + @SchedulerLock(name = "updateScheduler", + lockAtLeastFor = "PT30M", lockAtMostFor = "PT59M") public void updateSchedule() { List storeList = storeRepository.findAll(); for (Store store : storeList) {