배치데드락로그

This commit is contained in:
ysCha 2026-02-11 13:10:13 +09:00
parent 0e37811b53
commit 725de4d86b

View File

@ -297,8 +297,9 @@ public class JobLauncherController {
long initialDelay = 60000; // 1분 long initialDelay = 60000; // 1분
while (retryCount < maxRetries) { while (retryCount < maxRetries) {
JobParameters jobParameters = null;
try { try {
JobParameters jobParameters = new JobParametersBuilder() jobParameters = new JobParametersBuilder()
.addString("jobName", jobName) .addString("jobName", jobName)
.addDate("time", new Date()) .addDate("time", new Date())
.addLong("run.id", System.currentTimeMillis()) .addLong("run.id", System.currentTimeMillis())
@ -316,14 +317,12 @@ public class JobLauncherController {
logExceptionDetails("Scheduled launch failed", jobName, e); logExceptionDetails("Scheduled launch failed", jobName, e);
// 데드락 오류인지 확인 // 데드락 오류인지 확인
boolean isDeadlock = e.getCause() != null && boolean isDeadlock = isDeadlockException(e);
e.getCause().getMessage() != null &&
e.getCause().getMessage().toLowerCase().contains("deadlock");
if (isDeadlock && retryCount < maxRetries) { if (isDeadlock && retryCount < maxRetries) {
long delay = initialDelay * retryCount; // 1분, 2분, 3분 증가 long delay = initialDelay * retryCount; // 1분, 2분, 3분 증가
log.warn("Job {} 실행 중 데드락 발생. {}/{} 재시도 ({}ms 후 재시도)...", log.warn("Deadlock detected for job {}. retry {}/{} in {}ms. params={}",
jobName, retryCount, maxRetries, delay, e); jobName, retryCount, maxRetries, delay, jobParameters);
try { try {
Thread.sleep(delay); Thread.sleep(delay);
@ -395,10 +394,42 @@ public class JobLauncherController {
} }
if (root instanceof SQLException) { if (root instanceof SQLException) {
SQLException sqlEx = (SQLException) root; SQLException sqlEx = (SQLException) root;
log.error("{} for job {}: SQLState={}, errorCode={}, message={}", log.error("{} for job {}: SQLState={}, errorCode={}, message={}, sqlChain={}",
context, jobName, sqlEx.getSQLState(), sqlEx.getErrorCode(), sqlEx.getMessage(), e); context, jobName, sqlEx.getSQLState(), sqlEx.getErrorCode(), sqlEx.getMessage(),
buildSqlExceptionChain(sqlEx), e);
} else { } else {
log.error("{} for job {}: {}", context, jobName, root.getMessage(), e); log.error("{} for job {}: {}", context, jobName, root.getMessage(), e);
} }
} }
private boolean isDeadlockException(Throwable throwable) {
Throwable root = throwable;
while (root.getCause() != null) {
root = root.getCause();
}
if (root instanceof SQLException) {
SQLException sqlEx = (SQLException) root;
return "40001".equals(sqlEx.getSQLState()) || sqlEx.getErrorCode() == 1205;
}
String message = root.getMessage();
return message != null && message.toLowerCase().contains("deadlock");
}
private String buildSqlExceptionChain(SQLException sqlEx) {
StringBuilder sb = new StringBuilder();
SQLException current = sqlEx;
int depth = 0;
while (current != null && depth < 10) {
if (depth > 0) {
sb.append(" | ");
}
sb.append("[").append(current.getClass().getSimpleName())
.append(" sqlState=").append(current.getSQLState())
.append(" errorCode=").append(current.getErrorCode())
.append(" message=").append(current.getMessage()).append("]");
current = current.getNextException();
depth++;
}
return sb.toString();
}
} }