2018.8.2 자바 전자상거래 1 부터 2 - chapter 15 ~ 16 SpringSchedule + Redission 까지 분포 식 작업 스케줄 링 실현
3957 단어 자바 전자상거래 1 부터 2 까지
제1 5 장 Redission 사용
15.1 총람
15.2 Redission 소개
15.3 리 디 션 통합
15.4 Redission 사용
제1 6 장 스프링 사용 schedule + Redission 분포 식 작업 스케줄 링 실현
16.1 총람
16.2 정시 퀘 스 트 사용 Redission
16.3 wait_시간의 구덩이
제1 5 장 Redission 사용
15.1 총람
15.2 Redission 소개
생략
15.3 리 디 션 통합
Redission 의존 도 를 추가 할 뿐만 아니 라 fastxml 의존 도 추가 해 야 합 니 다.
org.redisson
redisson
2.9.0
com.fasterxml.jackson.dataformat
jackson-dataformat-avro
2.9.0
15.4 Redission 사용
package com.mmall.common;
import com.mmall.util.PropertiesUtil;
import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.config.Config;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* Created by geely
*/
@Component
@Slf4j
public class RedissonManager {
private Config config = new Config();
private Redisson redisson = null;
public Redisson getRedisson() {
return redisson;
}
private static String redis1Ip = PropertiesUtil.getProperty("redis1.ip");
private static Integer redis1Port = Integer.parseInt(PropertiesUtil.getProperty("redis1.port"));
private static String redis2Ip = PropertiesUtil.getProperty("redis2.ip");
private static Integer redis2Port = Integer.parseInt(PropertiesUtil.getProperty("redis2.port"));
@PostConstruct
private void init(){
try {
config.useSingleServer().setAddress(new StringBuilder().append(redis1Ip).append(":").append(redis1Port).toString());
redisson = (Redisson) Redisson.create(config);
log.info(" Redisson ");
} catch (Exception e) {
log.error("redisson init error",e);
}
}
}
제1 6 장 스프링 사용 schedule + Redission 분포 식 작업 스케줄 링 실현
16.1 총람
16.2 정시 퀘 스 트 사용 Redission
@Component
@Slf4j
public class CloseOrderTask {
@Autowired
private IOrderService iOrderService;
@Autowired
private RedissonManager redissonManager;
@Scheduled(cron="0 */1 * * * ?")
public void closeOrderTaskV4(){
RLock lock = redissonManager.getRedisson().getLock(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);
boolean getLock = false;
try {
if(getLock = lock.tryLock(0,5, TimeUnit.SECONDS)){
log.info("Redisson :{},ThreadName:{}",Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK,Thread.currentThread().getName());
int hour = Integer.parseInt(PropertiesUtil.getProperty("close.order.task.time.hour","2"));
iOrderService.closeOrder(hour);
}else{
log.info("Redisson :{},ThreadName:{}",Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK,Thread.currentThread().getName());
}
} catch (InterruptedException e) {
log.error("Redisson ",e);
} finally {
if(!getLock){
return;
}
lock.unlock();
log.info("Redisson ");
}
}
}
16.3 wait_시간의 구덩이
lock.tryLock(0,5, TimeUnit.SECONDS)
자 물 쇠 를 가 져 올 때 대기 시간 과 유지 시간 을 설정 해 야 합 니 다.대기 시간 설정 이 맞지 않 으 면 프로 세 스 1 이 자 물 쇠 를 가 져 오고 정시 작업 을 수행 한 후에 프로 세 스 2 가 자 물 쇠 를 가 져 오 는 대기 시간 에 이 르 지 못 하면 프로 세 스 2 는 자 물 쇠 를 가 져 오고 작업 을 다시 수행 합 니 다.
그래서 두 가지 해결 방법 이 있 습 니 다. 하 나 는 waittime 을 0 으로 설정 합 니 다.디 버 깅 으로 작업 수행 의 대략적인 시간 을 평가 하고 더 작은 대기 시간 을 설정 하 는 것 입 니 다. 위험 하지만.