diff --git a/src/main/java/io/github/yubincloud/fairywiki/job/EbookSnapshotJob.java b/src/main/java/io/github/yubincloud/fairywiki/job/EbookSnapshotJob.java new file mode 100644 index 0000000000000000000000000000000000000000..ad8334f000c0bd00b5befc4eefe99c30398c78dc --- /dev/null +++ b/src/main/java/io/github/yubincloud/fairywiki/job/EbookSnapshotJob.java @@ -0,0 +1,38 @@ +package io.github.yubincloud.fairywiki.job; + +import io.github.yubincloud.fairywiki.service.EbookSnapshotService; +import io.github.yubincloud.fairywiki.utils.SnowFlake; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Component +public class EbookSnapshotJob { + + private static final Logger LOG = LoggerFactory.getLogger(EbookSnapshotJob.class); + + @Resource + private EbookSnapshotService ebookSnapshotService; + + @Resource + private SnowFlake snowFlake; + + /** + * 自定义cron表达式跑批 + * 只有等上一次执行完成,下一次才会在下一个时间点执行,错过就错过 + */ + @Scheduled(cron = "0/5 * * * * ?") + public void doSnapshot() { + // 增加日志流水号 + MDC.put("LOG_ID", String.valueOf(snowFlake.nextId())); + LOG.info("生成今日电子书快照开始"); + long start = System.currentTimeMillis(); + ebookSnapshotService.genSnapshots(); + LOG.info("生成今日电子书快照结束,耗时:{}毫秒", System.currentTimeMillis() - start); + } + +} diff --git a/src/main/java/io/github/yubincloud/fairywiki/mapper/EbookSnapshotMapperCustom.java b/src/main/java/io/github/yubincloud/fairywiki/mapper/EbookSnapshotMapperCustom.java new file mode 100644 index 0000000000000000000000000000000000000000..6a50b0aebe0c706628d41db1bf973c7eb9453e64 --- /dev/null +++ b/src/main/java/io/github/yubincloud/fairywiki/mapper/EbookSnapshotMapperCustom.java @@ -0,0 +1,5 @@ +package io.github.yubincloud.fairywiki.mapper; + +public interface EbookSnapshotMapperCustom { + void genSnapshot(); +} diff --git a/src/main/java/io/github/yubincloud/fairywiki/service/EbookSnapshotService.java b/src/main/java/io/github/yubincloud/fairywiki/service/EbookSnapshotService.java index d082894a123559a8b5e90d27f4dd60f79ca230f3..65aa96c633178271a6dce9f5c36db7692d6de81b 100644 --- a/src/main/java/io/github/yubincloud/fairywiki/service/EbookSnapshotService.java +++ b/src/main/java/io/github/yubincloud/fairywiki/service/EbookSnapshotService.java @@ -1,6 +1,6 @@ package io.github.yubincloud.fairywiki.service; -import io.github.yubincloud.fairywiki.mapper.EbookSnapshotMapper; +import io.github.yubincloud.fairywiki.mapper.EbookSnapshotMapperCustom; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -9,5 +9,9 @@ import javax.annotation.Resource; public class EbookSnapshotService { @Resource - private EbookSnapshotMapper ebookSnapshotMapper; + private EbookSnapshotMapperCustom ebookSnapshotMapperCustom; + + public void genSnapshots() { + ebookSnapshotMapperCustom.genSnapshot(); + } } diff --git a/src/main/resources/mapper/EbookSnapshotMapperCustom.xml b/src/main/resources/mapper/EbookSnapshotMapperCustom.xml new file mode 100644 index 0000000000000000000000000000000000000000..58563406efd4cdad45e89a88bcae33444e31a62f --- /dev/null +++ b/src/main/resources/mapper/EbookSnapshotMapperCustom.xml @@ -0,0 +1,40 @@ + + + + + + + INSERT INTO ebook_snapshot(ebook_id, `date`, view_count, vote_count, view_increase, vote_increase) + SELECT t1.id, curdate(), 0, 0, 0, 0 + FROM ebook t1 + WHERE NOT EXISTS(SELECT 1 + FROM ebook_snapshot t2 + WHERE t1.id = t2.ebook_id + AND t2.`date` = curdate()); + + UPDATE ebook_snapshot t1, ebook t2 + SET t1.view_count = t2.view_count, + t1.vote_count = t2.vote_count + WHERE t1.`date` = curdate() + AND t1.ebook_id = t2.id; + + UPDATE ebook_snapshot t1 LEFT JOIN (SELECT ebook_id, view_count, vote_count + FROM ebook_snapshot + WHERE `date` = date_sub(curdate(), INTERVAL 1 DAY)) t2 + ON t1.ebook_id = t2.ebook_id + SET t1.view_increase = (t1.view_count - ifnull(t2.view_count, 0)), + t1.vote_increase = (t1.vote_count - ifnull(t2.vote_count, 0)) + WHERE t1.`date` = curdate(); + + + \ No newline at end of file