|
@@ -15,6 +15,8 @@ import com.qs.mp.common.enums.UserTypeEnum;
|
|
|
import com.qs.mp.common.utils.DateUtils;
|
|
|
import com.qs.mp.common.utils.LogUtil;
|
|
|
import com.qs.mp.framework.domain.WxSubscribeMessage;
|
|
|
+import com.qs.mp.framework.redis.RedisKey;
|
|
|
+import com.qs.mp.framework.redis.RedisLockKey;
|
|
|
import com.qs.mp.framework.service.IWxSubscribeMessage;
|
|
|
import com.qs.mp.user.domain.MarketingUserCode;
|
|
|
import com.qs.mp.user.service.IMarketingUserCodeService;
|
|
@@ -41,10 +43,6 @@ import java.util.concurrent.TimeUnit;
|
|
|
@Component("marketingTask")
|
|
|
public class MarketingTask {
|
|
|
|
|
|
- public static final String MARKETING_LOTTERY_KEY = "MARKETING_LOTTERY_KEY:%s";
|
|
|
-
|
|
|
- public static final String MARKETING_SEND_KEY = "MARKETING_SEND_KEY";
|
|
|
-
|
|
|
|
|
|
@Autowired
|
|
|
private DistributedLocker distributedLocker;
|
|
@@ -76,9 +74,9 @@ public class MarketingTask {
|
|
|
}
|
|
|
|
|
|
for (Marketing marketing : marketingList) {
|
|
|
- String lockKey = String.format(MARKETING_LOTTERY_KEY, marketing.getId());
|
|
|
- // 加锁
|
|
|
- if (!distributedLocker.tryLock(lockKey)) {
|
|
|
+ String lockKey = RedisLockKey.build(RedisLockKey.MARKETING_LOTTERY_KEY, marketing.getId());
|
|
|
+ // 加锁,自动续期
|
|
|
+ if (!distributedLocker.tryLock(lockKey,0,-1,TimeUnit.SECONDS)) {
|
|
|
continue;
|
|
|
}
|
|
|
try {
|
|
@@ -108,48 +106,35 @@ public class MarketingTask {
|
|
|
* 发送活动开始通知
|
|
|
*/
|
|
|
public void sendMessage() {
|
|
|
- // 加锁防止频繁发送
|
|
|
- if (!distributedLocker.tryLock(MARKETING_SEND_KEY)) {
|
|
|
+ // 获取开始时间小于等于当前时间且未发开始通知的活动
|
|
|
+ Date now = DateUtils.getNowDate();
|
|
|
+ List<Marketing> marketingList = marketingService.list(new LambdaQueryWrapper<Marketing>()
|
|
|
+ .eq(Marketing::getTriggerStatus, 0)
|
|
|
+ .eq(Marketing::getIsOn, MarketingStatusEnum.ON.getValue())
|
|
|
+ .eq(Marketing::getIsSend, 0)
|
|
|
+ .le(Marketing::getStartTime, now));
|
|
|
+ if (CollectionUtils.isEmpty(marketingList)) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- try{
|
|
|
- // 获取开始时间小于等于当前时间且未发开始通知的活动
|
|
|
- Date now = DateUtils.getNowDate();
|
|
|
- List<Marketing> marketingList = marketingService.list(new LambdaQueryWrapper<Marketing>()
|
|
|
- .eq(Marketing::getTriggerStatus, 0)
|
|
|
- .eq(Marketing::getIsOn, MarketingStatusEnum.ON.getValue())
|
|
|
- .eq(Marketing::getIsSend, 0)
|
|
|
- .le(Marketing::getStartTime, now));
|
|
|
- if (CollectionUtils.isEmpty(marketingList)) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- // 获取所有参与过活动的普通用户
|
|
|
- List<MarketingUserCode> userCodeList = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
|
|
|
- .eq(MarketingUserCode::getUserType, UserTypeEnum.ORDINARY.getValue()));
|
|
|
- if (CollectionUtils.isEmpty(userCodeList)) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- for (Marketing marketing : marketingList) {
|
|
|
- for (MarketingUserCode marketingUserCode : userCodeList) {
|
|
|
- // 发送开始订阅通知
|
|
|
- wxSubscribeMessage.sendMarketingStart(marketingUserCode.getUserId(), marketing);
|
|
|
- }
|
|
|
+ // 获取所有参与过活动的普通用户
|
|
|
+ List<MarketingUserCode> userCodeList = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
|
|
|
+ .eq(MarketingUserCode::getUserType, UserTypeEnum.ORDINARY.getValue()));
|
|
|
+ if (CollectionUtils.isEmpty(userCodeList)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- // 更新活动通知发送状态
|
|
|
- marketingService.update(new LambdaUpdateWrapper<Marketing>()
|
|
|
- .set(Marketing::getIsSend, 1)
|
|
|
- .eq(Marketing::getId, marketing.getId()));
|
|
|
+ for (Marketing marketing : marketingList) {
|
|
|
+ for (MarketingUserCode marketingUserCode : userCodeList) {
|
|
|
+ // 发送开始订阅通知
|
|
|
+ wxSubscribeMessage.sendMarketingStart(marketingUserCode.getUserId(), marketing);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- } finally {
|
|
|
- // 释放锁
|
|
|
- distributedLocker.unlock(MARKETING_SEND_KEY);
|
|
|
+ // 更新活动通知发送状态
|
|
|
+ marketingService.update(new LambdaUpdateWrapper<Marketing>()
|
|
|
+ .set(Marketing::getIsSend, 1)
|
|
|
+ .eq(Marketing::getId, marketing.getId()));
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
/**
|