파이널 프로젝트로 예약사이트를 만들고 있는데, 일단 예약이랑 결제 취소는 되는데,
예약날짜로부터 일정시간이 지났을 때
1.예약만걸어두고 결제를 안했다면 => 취소
2. 예약하고 결제까지 했다면 => 이용완료
이렇게 바꾸고 싶었다.
처음에는 오라클의 '잡 스케쥴러'를 써보려고 블로그 글 보면서 따라했는데... 자꾸 STATUS가 FAILED 가 떴다.
잘 몰라서 이유 찾기가 좀 힘들었다. 그래서 강사님께 여쭤보니 스프링 스케쥴러를 알려주면서 이걸로 하면 쉽게 할수 있다고 했다.
먼저, 제일 먼저 할 일은 계속 일정시간마다 진행할 프로시저를 만들었다.
create or replace PROCEDURE HAR_RESERVATION_DATE
IS
ARG_RES_STATUS NUMBER;
BEGIN
FOR i IN (SELECT RES_STATUS FROM HAR_RESERVATION ) LOOP
ARG_RES_STATUS := i.res_status; -- for문으로 나온 res_status를 변수에 집어넣는다.
IF ARG_RES_STATUS = 0 THEN --status가 0(예약취소)고 오늘 날짜보다 느리면 3(예약취소)
UPDATE HAR_RESERVATION SET RES_STATUS = 3 WHERE RES_DATE < SYSDATE AND ARG_RES_STATUS = 0;
ELSIF ARG_RES_STATUS = 1 THEN --status가 1(결제완료)고 오늘 날짜보다 느리면 2(이용완료)
UPDATE HAR_RESERVATION SET RES_STATUS = 2 WHERE RES_DATE < SYSDATE AND ARG_RES_STATUS = 1;
END IF;
END LOOP;
COMMIT;
END;
두번째, servlet_context.xml의 Namespaces에서 task를 체크하고 아래와 같은 태그를 추가해준다.
<task:annotation-driven/>
세번째, 해당 프로시저를 실행할 DAO와 Mapper파일을 생성한다. (예약관련 DAO와 MAPPER 밑에 추가 생성했음)
public void updateRevByScheduled(){
try {
sqlSession.update("shopPay.updateRevByScheduled");
} catch(Exception e) {
e.printStackTrace();
}
}
<update id="updateRevByScheduled" statementType="CALLABLE">
<![CDATA[
{CALL HAR_RESERVATION_DATE}
]]>
</update>
***mapper파일의 경우 그냥 CALL HAR_RESERVATION_DATE 만 썼을때 에러가 발생했다.
이유를 들어보니 매개변수가 없어서 얘가 계속 불러올 값이 있는줄 알고 대기타고 있고 그냥 계속 공백만 들어가서 그런거였다.....ㅎㅎ 그래서 나 끝났음!!을 나타내는 {}로 묶어주니 실행 잘됨~~~
네번째, DAO를 호출할 Component 생성!
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import kh.com.petbreedding.Shop.model.dao.ShopPayDao;
@Component
public class ScheduledRegistration {
@Autowired
private ShopPayDao shopPayDao;
@Scheduled(cron = "0 0 0 * * *")
public void registration() {
System.out.println("[ @Scheduled]registration 시작");
shopPayDao.updateRevByScheduled();
shopPayDao.updateRevByScheduled2();
System.out.println("[ @Scheduled]registration 끝");
}
}
예약테이블이 여러개면 위와같이 여러개 호출도 된당~~
** cron()을 통해서 시간을 정할 수 있다. 나는 매일 0시 0분 0초에 실행되게 만들어놨다.
https://madplay.github.io/post/a-guide-to-cron-expression
서버를 구동시켜놓으면 Console창에서 설정해놓은 시간이 되었을 때 돌아가는 것을 확인할 수 있다.
(+++ 서버 구동안하면 실행안됨!)
'SPRING' 카테고리의 다른 글
JSTL) c:forEach item 2개일때 사용법 (0) | 2021.07.02 |
---|---|
OAUTH란 (0) | 2021.06.17 |
No converter found for return value of type 에러 발생 (0) | 2021.06.15 |
어노테이션 연결 (0) | 2021.06.15 |
mapper.xml 생성하기 (0) | 2021.06.10 |