배치데드락로그
This commit is contained in:
parent
0e37811b53
commit
725de4d86b
@ -297,8 +297,9 @@ public class JobLauncherController {
|
||||
long initialDelay = 60000; // 1분
|
||||
|
||||
while (retryCount < maxRetries) {
|
||||
JobParameters jobParameters = null;
|
||||
try {
|
||||
JobParameters jobParameters = new JobParametersBuilder()
|
||||
jobParameters = new JobParametersBuilder()
|
||||
.addString("jobName", jobName)
|
||||
.addDate("time", new Date())
|
||||
.addLong("run.id", System.currentTimeMillis())
|
||||
@ -316,14 +317,12 @@ public class JobLauncherController {
|
||||
logExceptionDetails("Scheduled launch failed", jobName, e);
|
||||
|
||||
// 데드락 오류인지 확인
|
||||
boolean isDeadlock = e.getCause() != null &&
|
||||
e.getCause().getMessage() != null &&
|
||||
e.getCause().getMessage().toLowerCase().contains("deadlock");
|
||||
boolean isDeadlock = isDeadlockException(e);
|
||||
|
||||
if (isDeadlock && retryCount < maxRetries) {
|
||||
long delay = initialDelay * retryCount; // 1분, 2분, 3분 증가
|
||||
log.warn("Job {} 실행 중 데드락 발생. {}/{} 재시도 ({}ms 후 재시도)...",
|
||||
jobName, retryCount, maxRetries, delay, e);
|
||||
log.warn("Deadlock detected for job {}. retry {}/{} in {}ms. params={}",
|
||||
jobName, retryCount, maxRetries, delay, jobParameters);
|
||||
|
||||
try {
|
||||
Thread.sleep(delay);
|
||||
@ -395,10 +394,42 @@ public class JobLauncherController {
|
||||
}
|
||||
if (root instanceof SQLException) {
|
||||
SQLException sqlEx = (SQLException) root;
|
||||
log.error("{} for job {}: SQLState={}, errorCode={}, message={}",
|
||||
context, jobName, sqlEx.getSQLState(), sqlEx.getErrorCode(), sqlEx.getMessage(), e);
|
||||
log.error("{} for job {}: SQLState={}, errorCode={}, message={}, sqlChain={}",
|
||||
context, jobName, sqlEx.getSQLState(), sqlEx.getErrorCode(), sqlEx.getMessage(),
|
||||
buildSqlExceptionChain(sqlEx), e);
|
||||
} else {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user