본문 바로가기
IT 자료

java.lang.IllegalArgumentException: Unable to deserialize the execution context

by 성곤 2023. 7. 4.
반응형

자바 스프링 에러

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"}' 형식으로 입력되기 때문에 기존 데이터와의 충돌로 인해 오류가 발생한다.

 

작업 전, 후 테이블 (BATCH_JOB_EXECUTION_CONTEXT)

/* 업데이트 전, 작업 대상 확인 쿼리 */
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;


자료 참조 : https://stackoverflow.com/questions/62718203/spring-batch-4-2-4-unable-to-deserialize-the-execution-context

반응형