자바 스프링 에러
java.lang.IllegalArgumentException: Unable to deserialize the execution context
at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao$ExecutionContextRowMapper.mapRow(JdbcExecutionContextDao.java:328)
at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao$ExecutionContextRowMapper.mapRow(JdbcExecutionContextDao.java:312)
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:94)
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:61)
....
해당 오류 문제는 역직렬화를 못해서 생긴 문제라고 하는데..
필자는 스프링 프레임워크 버전업을 하면서 문제가 생겼다.
라이브러리
: org.springframework.batch:spring-batch-core
버전
: 4.2.2.RELEASE -> 4.2.3.RELEASE 이상으로 변경 시 오류 발생
원인
: 스프링프레임워크 배치 관련 테이블 컬럼의 데이터 포맷 변경으로 인한 오류
테이블 batch_job_execution_context, 컬럼 short_context
테이블 batch_step_execution_context, 컬럼 short_context
해결방법으로는 2가지가 있다. (혹은 4.2.2.RELEASE 버전 이하로 롤백..)
1. short_context 컬럼 업데이트
컬럼의 값을 조회해보면 '{}'으로 들어가 있을 것이다.
하지만, 스프링배치코어의 업데이트로 인해 '{"@class":"java.util.HashMap"}' 형식으로 입력되기 때문에 기존 데이터와의 충돌로 인해 오류가 발생한다.
/* 업데이트 전, 작업 대상 확인 쿼리 */
select
a.*
, case
when SHORT_CONTEXT = '{}' then '{"@class":"java.util.HashMap"}'
else replace(SHORT_CONTEXT, '{"', '{"@class":"java.util.HashMap","')
end as test
from BATCH_STEP_EXECUTION_CONTEXT a
where 1=1
and SHORT_CONTEXT LIKE '{%'
and SHORT_CONTEXT not like '%{"@class%'
order by 1 desc ;
/* 업데이트 쿼리 */
update BATCH_JOB_EXECUTION_CONTEXT
set
SHORT_CONTEXT =
case
when SHORT_CONTEXT = '{}' then '{"@class":"java.util.HashMap"}'
else replace(SHORT_CONTEXT, '{"', '{"@class":"java.util.HashMap","')
end
where 1=1
and SHORT_CONTEXT LIKE '{%'
and SHORT_CONTEXT not like '%{"@class%'
;
/* 업데이트 전, 작업 대상 확인 쿼리 */
select
a.*
, case
when SHORT_CONTEXT = '{}' then '{"@class":"java.util.HashMap"}'
else replace(SHORT_CONTEXT, '{"', '{"@class":"java.util.HashMap","')
end as test
from BATCH_JOB_EXECUTION_CONTEXT a
where 1=1
and SHORT_CONTEXT LIKE '{%'
and SHORT_CONTEXT not like '%{"@class%'
order by 1 desc ;
/* 업데이트 쿼리 */
update BATCH_STEP_EXECUTION_CONTEXT
set
SHORT_CONTEXT =
case
when SHORT_CONTEXT = '{}' then '{"@class":"java.util.HashMap"}'
else replace(SHORT_CONTEXT, '{"', '{"@class":"java.util.HashMap","')
end
where 1=1
and SHORT_CONTEXT LIKE '{%'
and SHORT_CONTEXT not like '%{"@class%'
;
2. 테이블 데이터 제거
만약, 업데이트 이후에도 오류가 발생한다면 테이블 전체 로우를 삭제하는 방법이 있다.
본인은 방법 1을 먼저했고, 대부분의 배치에서 문제가 발생하지 않았다.
하지만, 운이 나쁘게도 수백의 배치 중에 딱 1건이 동일한 오류가 발생하였고, 결국 테이블 전체를 백업 후, 지워버리고 해결할 수 있었다.
DELETE FROM BATCH_JOB_EXECUTION_CONTEXT;
DELETE FROM BATCH_STEP_EXECUTION_CONTEXT;
'IT 자료' 카테고리의 다른 글
postgresql.pk8 생성하기 (2) | 2023.12.26 |
---|---|
java.lang.UnsupportedOperationException: A TupleBackedMap cannot be modified. (0) | 2023.07.13 |
PostgreSQL ssl 연결(java spring) (0) | 2023.05.21 |
데이터 레이크 한눈에보기 (0) | 2023.03.04 |
엑셀로 mysql varchar 50의 길이만큼 자르는 방법 (0) | 2022.06.10 |