一. @EnableScheduling
注解开启定时任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package io.coderyeah.ymcc;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling @SpringBootApplication public class KillServiceApp { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(KillServiceApp.class); } }
|
二. @Scheduled(cron = "0 0 0 * * ?")
指定定时任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| import cn.hutool.core.date.DateUtil; import io.coderyeah.ymcc.domain.KillActivity; import io.coderyeah.ymcc.service.IKillActivityService; import io.coderyeah.ymcc.util.AssertUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;
import java.util.List;
@Component @Slf4j public class PublishKillCourse2Redis { @Autowired private IKillActivityService activityService;
@Scheduled(cron = "0 0 0 * * ?") public void publish() { List<KillActivity> activities = activityService.getCurrentData(); AssertUtil.isNotNull(activities, "今日暂无秒杀活动发布"); log.info("{}--任务准备发布到redis~~~", DateUtil.now()); activities.forEach(killActivity -> { activityService.publish(killActivity.getId()); }); log.info("{}--已发布到redis~~~", DateUtil.now()); } }
|
三. 发布方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| @Autowired private RedissonClient redissonClient; @Autowired private IKillCourseService courseService; @Autowired private RedisTemplate<Object, Object> redisTemplate; @Autowired private KillActivityMapper activityMapper;
@Transactional @Override public void publish(Long id) { KillActivity killActivity = selectById(id); AssertUtil.isNotNull(killActivity, "秒杀活动不存在"); AssertUtil.isEqualsTrim(killActivity.getPublishStatus().toString(), KillActivity.KILL_WAIT_PUBLISH.toString(), "活动已发布或已结束"); AssertUtil.isFalse(killActivity.getStartTime().after(new Date()), "活动未开启,请在规定时间发布"); AssertUtil.isFalse(killActivity.getEndTime().before(new Date()), "活动已经结束"); Wrapper<KillCourse> wrapper = new EntityWrapper<>(); wrapper.eq("activity_id", id); List<KillCourse> courses = courseService.selectList(wrapper); killActivity.setPublishTime(new Date()); killActivity.setPublishStatus(KillActivity.KILL_OK_PUBLISH); updateById(killActivity);
courses.forEach(course -> { RSemaphore semaphore = redissonClient.getSemaphore(course.getId().toString()); boolean b = semaphore.trySetPermits(course.getKillCount()); log.info("设置信号量:{}", b); AssertUtil.isTrue(b, "获取信号量失败"); String key = RedisConstants.KILL_ACTIVITY + id; redisTemplate.opsForHash().put(key, course.getCourseId().toString(), course); course.setPublishStatus(KillCourse.KILLING); course.setPublishTime(new Date()); courseService.updateById(course); }); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;
@Configuration public class RedissonConfig {
@Bean public RedissonClient redissonClient(){ Config config = new Config(); config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("123456"); return Redisson.create(config); } }
|
1 2 3 4 5
| <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.17.7</version> </dependency>
|
使用SpringBoot的定时任务发布秒杀活动到redis