crontab_to_infoStr.html
다운로드
TMS, PUSH 등을 주기적으로 전송하는 시스템을 위해 만든 크론탭 생성 스크립트 . 크론탭을 모르는 일반 관리자들을 위해,. DB 저장시엔 crontab 양식으로, 화면에 노출되는 방식은 한글로 처리 하기 위해 주기적으로 전송건이마, 전송 기한이 정해여 있기 때문에 크론탭 형식으로 등록하고 관리.
<!doctype html>
<html lang="en">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
<!--
$(document).ready(function() {
translateCrontab();
itemChange(); // 주기 세팅
// 발송주기 세팅 start
for ( var i=0 ; i < 24 ; i ++)
{
// 분
if(i<6)
$('#cycle_mm').append($("<option>"+(i==0?"0":"")+( i*10) +"</option>"));
// 시각
$('#cycle_tt').append( $("<option>"+(i<10?"0":"")+i +"</option>"));
}
// 발송주기 세팅 end
});
/**
* 발송 주기 변환 * crontab -> 설명
* 발송주기를 사용하는 ellement 에 class 선언 필수 class ='regulary_cycle'
* @author edward 2019-03-21
* @return 발송주기 한글
* Spring Quartz crontab 형식을 한글로 변환한다.
* >> 1: 초(0~59) , 2: 분(0~59) , 3: 시(0~23) , 4 : 일 ( 1~ 31 ) , 5 : 월 (1~12) , 6: 요일 ( 0~6 ) , 7:년도(생략 )
? : 조건없음 [일, 요일 에서만 사용가능]
* : 모든 조건에서 참
L : [일, 요일 에서만 사용가능]
- 일에서 사용하면 : 예(L) 마지막 날짜입니다. 예를들어 1월이라면 31일 2월이라면 윤년에 따라 28혹은 29일 4월이라면 30일에 참.
- 요일에서 사용하면 : 예(6L) 6은(토요일) 마지막 토요일에 실행됩니다. 마지막주가 토요일이 없다면 그전주 토요일에 참.\
W : [일에서만 사용가능]
- 가장 가까운 평일(월~토)를 찾습니다.
- 15W 라고 설정했다면 15일이 월~금 범위라면 해당 날짜에서 참.
- 15W 15일이 토요일이라면 가장 가까운 금요일인 14일에 참.
- 15W 15일이 일요일이라면 가장 가까운 월요일인 16일에 참.
# : [요일에서만 사용가능]
- 예를들어 3#2 라고 썻다면 (수요일#2번째주)라는 의미가 됩니다.
- 즉 2번째주의 수요일에 참이 됩니다.
*/
function translateCrontab()
{
var arrList = $(".regulary_cycle"); // 발송주기를 사용하는 ellement 에 class 선언
var cronrtabExp ;
var crontabStr ;
$.each(arrList, function(index, item)
{
// 0: 초(0~59) , 1: 분(0~59) , 2: 시(0~23) , 3 : 일 ( 1~ 31 ) , 4 : 월 (1~12) , 5: 요일 ( 0~6 )
cronrtabExp = $(this).text().split(" ");
crontabStr = '';
// 특정 요일
if(cronrtabExp[5] !="*")
{
switch(cronrtabExp[5])// 6: 요일 ( 0~6 )
{
case '0' : crontabStr = "일" ; break;
case '1' : crontabStr = "월" ; break;
case '2' : crontabStr = "화" ; break;
case '3' : crontabStr = "수" ; break;
case '4' : crontabStr = "목" ; break;
case '5' : crontabStr = "금" ; break;
case '6' : crontabStr = "토" ; break;
}
crontabStr = "매주 "+ crontabStr+"요일 ";
}
else
{
if(cronrtabExp[3] !="*"){// 특정 일
crontabStr = "매월 "+ cronrtabExp[3]+"일 ";
} else{ // 전체 일
crontabStr = "매일 ";
}
}
crontabStr = crontabStr + cronrtabExp[2] + " 시 ";// 3: 시(0~23)
crontabStr = crontabStr + cronrtabExp[1] + " 분"; // 2: 분(0~59)
// crontabStr = crontabStr + cronrtabExp[0] + " 초" // 1: 초(0~59) parseInt
//crontabStr = " [ "+ $(this).text() + " ] "+crontabStr ;
$(this).text(crontabStr);
});
}
function itemChange()
{
var cycleDD = ["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일"]; // 매월
var cycleW = ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"]; // 매주
var selectItem = $("#cycle_1").val();
$('#cycle_2').empty();
if(selectItem == "매일") {
$('#cycle_2').hide();
}else{
$('#cycle_2').show();
var changeItem;
if(selectItem == "매월") changeItem = cycleDD;
else if(selectItem == "매주") changeItem = cycleW;
for (var j in changeItem) {
var option = $("<option>"+changeItem[j]+"</option>");
$('#cycle_2').append(option);
}
}
} // en itemChange
//-->
</script>
</head>
<body>
<!-- crontab to 한글 주기 설명 변환 -->
0 40 3 * * 2 : <span class="regulary_cycle">0 40 3 * * 2</span></br>
0 20 3 * * * : <span class="regulary_cycle">0 20 3 * * *</span></br>
0 0 4 19 * * : <span class="regulary_cycle">0 0 4 19 * *</span></br>
0 0 1 * * 1 : <span class="regulary_cycle">0 0 1 * * 1</span></br>
<!-- 주기 선택에 따른 선택 사항 자동 변경 -->
<select id="cycle_1" onchange="itemChange()" style="width:60px;">
<option>매월</option>
<option>매주</option>
<option>매일</option>
</select> <!-- 월/주/일 -->
<select id="cycle_2" style="width:60px;"> </select> <!-- 일자/요일 -->
<select id="cycle_tt" style="width:40px;"> </select>시 <!-- 시간 -->
<select id="cycle_mm" style="width:40px;"> </select>분 <!-- 분 -->
</body>
</html>
JAVA 단에서는 실행주기에 따른 다음 실행일(getCronTabData)을 등록하였다.
public String getCurrentDate(String format) {
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
long now = System.currentTimeMillis();
return dateFormat.format(new Date(now));
}
public int getDayOfWeek(String dateStr) {
// dateStr = "2020-07-12";
dateStr = dateStr.replace("-","");
Calendar calendar = Calendar.getInstance();
int year = Integer.parseInt(dateStr.substring(0,4));
int month = Integer.parseInt(dateStr.substring(4,6)) -1 ; // 입력월.
int day = Integer.parseInt(dateStr.substring(6)) ; // -1;
System.out.println( "year : "+year + " / month : "+month +" / day : "+day );
calendar.set(year, month, day);
int o_lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println( "o_lastDay : "+o_lastDay );
return calendar.get(Calendar.DAY_OF_WEEK); // 1(일) ~7(토)
}
// 날짜 더하기
//
// @param dt(날짜) , y(년) , m(월), d(일)
// @Exam addDate("2019-03-21",1,6,1) -> 2020-09-22
// @return String
//
public String addDate(String dt, int y, int m, int d) throws Exception {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
Date date = format.parse(dt);
cal.setTime(date);
cal.add(Calendar.YEAR, y); //년 더하기
cal.add(Calendar.MONTH, m); //월 더하기
cal.add(Calendar.DATE, d); // 더하기
return format.format(cal.getTime());
}
//이번주 해당요일의 날자를 구함 .
// @author edward
// @param dateStr
// @return
//
public String getCurrentWeekDate(String dateStr, int dayofWeek ) throws Exception {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
Date date = format.parse(dateStr);
cal.setTime(date);
cal.set(Calendar.DAY_OF_WEEK, dayofWeek); // 일요일 (1) ~ 토요일(7)
return format.format(cal.getTime());
}
public String getCronTabData(Map<String,Object> params) {
String nextSendDate = this.getCurrentDate("yyyy-MM-dd"); // yyyyMMdd 오늘 날자 이후로 cycle에 맞게 등록.
String cycle_1 = String.valueOf(params.get("cycle_1")); // 매월, 매주,매일
String cycle_2 = String.valueOf(params.get("cycle_2")); // 매월 (1일 ~ 31일) , 매주 (일요일 ~ 토요일) , 매일 (없음)
int cycle_tt = Integer.valueOf(String.valueOf(params.get("cycle_tt"))); // 시간 : 00 ~ 23
int cycle_mm = Integer.valueOf(String.valueOf(params.get("cycle_mm"))); // 분 : 00 ~ 50 10분단위
int todayDayOfWeek = this.getDayOfWeek(nextSendDate.replace("-", "")) ;// 오늘날자의 요일 가져오기 // 1 (일) ~ 7 (토)
/*
* PUSH_CYCLE ( 발송주기)은 Spring Quartz crontab 형식으로 저장한다.
>> 1: 초(0~59) , 2: 분(0~59) , 3: 시(0~23) , 4 : 일 ( 1~ 31 ) , 5 : 월 (1~12) , 6: 요일 ( 0~6 ) , 7:년도(생략 )
초 분 시 일 월 요일 년도(생략)
0 0 3 * * * 매일 3시
0 30 0/1 * * * 매 시각 30분
0 0 18 * * 3 매주 수요일 6시
*/
StringBuffer pushCycle = new StringBuffer("0"); //초
pushCycle.append(" ").append(cycle_mm); // 분
pushCycle.append(" ").append(cycle_tt); // 시
if(cycle_1.equals("매월")) {
// 다음 실행일 세팅 : 등록한 날자가 오늘보다 같거나 작은 경우 다음주에 실행
int todayDD = Integer.parseInt(nextSendDate.substring(8));
int cycleDD = Integer.parseInt(cycle_2.replace("일", ""));
if(todayDD >= cycleDD ) {;
nextSendDate = this.addDate(nextSendDate,0,1,0) ;
}
pushCycle.append(" ").append(cycleDD); // 일
pushCycle.append(" *"); // 월
pushCycle.append(" *"); // 요일
}else if(cycle_1.equals("매주")) {
pushCycle.append(" *"); // 일
pushCycle.append(" *"); // 월
pushCycle.append(" "); // 요일
String dayOfWeek = cycle_2.substring(0,1); // dow : Days Of The Week
int cycleDayOfWeek =0;
if(dayOfWeek.equals("일")) cycleDayOfWeek = 1; //pushCycle.append(0);
else if(dayOfWeek.equals("월")) cycleDayOfWeek = 2; //pushCycle.append(1);
else if(dayOfWeek.equals("화")) cycleDayOfWeek = 3; //pushCycle.append(2);
else if(dayOfWeek.equals("수")) cycleDayOfWeek = 4; //pushCycle.append(3);
else if(dayOfWeek.equals("목")) cycleDayOfWeek = 5; //pushCycle.append(4);
else if(dayOfWeek.equals("금")) cycleDayOfWeek = 6; //pushCycle.append(5);
else if(dayOfWeek.equals("토")) cycleDayOfWeek = 7; //pushCycle.append(6);
else return "푸시 등록에 실패 하였습니다 관리자에게 문의하여 주십시오.";
pushCycle.append(--cycleDayOfWeek); // 요일 일(0) ~ 토(6)
// 다음 실행일 세팅 : 등록한 요일 정보가 오늘보다 같거나 작은 경우 다음주에 실행
nextSendDate = this.getCurrentWeekDate(nextSendDate, cycleDayOfWeek ); // 이번주 주기를 세팅한다. // 일요일 (1) ~ 토요일(7)
if( todayDayOfWeek >= cycleDayOfWeek) {
// addDate( 기준일자,년,월,일) ;
nextSendDate = this.addDate(nextSendDate,0,0,7) ;
}
}else if(cycle_1.equals("매일")) {
pushCycle.append(" *"); // 일
pushCycle.append(" *"); // 월
pushCycle.append(" *"); // 요일
}else {
return "푸시 등록에 실패 하였습니다 관리자에게 문의하여 주십시오.";
}
return pushCycle.toString(); // 발송 주기
}