반응형
Infinispan을 사용하는 분산 캐시 환경에서 다음과 같은 ClassCastException
이 발생하며 캐시 쓰기 작업이 실패하는 현상이 발견되었습니다.
에러 메시지 요약
ISPN000136: Error executing command PutKeyValueCommand on Cache 'APP.war'...
java.lang.ClassCastException:
org.infinispan.context.impl.SingleKeyNonTxInvocationContext
cannot be cast to
org.infinispan.context.impl.TxInvocationContext
원인 분석
이 에러는 Infinispan 내부 LockingInterceptor가 트랜잭션 컨텍스트(TxInvocationContext)를 전제로 실행되었는데,
실제 전달된 컨텍스트가 비트랜잭션(SingleKeyNonTxInvocationContext)인 경우에 발생합니다.
주요 원인
트랜잭션 미설정된 상태에서 트랜잭션 기반 명령 실행
- 캐시에
transactional=true
로 설정했으나, 실제 호출 시 트랜잭션이 시작되지 않음 - 또는 클라이언트 코드에서 트랜잭션을 생략하고 호출
- 캐시에
캐시 구성 불일치
- 클러스터 노드 간 Infinispan 설정이 다르거나, 일부 노드에만 트랜잭션 설정이 적용된 경우
버전 호환성 문제
- Infinispan의 특정 버전 간 인터셉터 호출 방식이 달라져 오류 발생 가능성 존재
해결 방법
1. 캐시 트랜잭션 설정 확인
infinispan.xml
또는 programmatic config에서 해당 캐시의 트랜잭션 설정을 명확히 선언하세요.
<distributed-cache name="AppCache" transactional="true">
<transaction mode="NON_XA"/>
</distributed-cache>
또는 Java Config:
configurationBuilder.transaction()
.transactionMode(TransactionMode.NON_XA);
캐시가 트랜잭션을 요구한다면, 반드시 호출 측에서도 트랜잭션이 활성화되어야 합니다.
2. 캐시 접근 코드에 트랜잭션 적용
Spring 또는 CDI 환경에서는 다음과 같이 @Transactional
을 선언하거나, 수동 트랜잭션 경계를 설정합니다.
@Transactional
public void updateCache(String key, Object value) {
cache.put(key, value); // 트랜잭션 컨텍스트 내에서 수행
}
3. 캐시 클러스터 구성 일관성 점검
- 모든 노드의 Infinispan 설정이 동일한지 확인
- 일부 노드에서만
transactional=true
설정이 있을 경우 ClassCastException 발생 가능
4. Infinispan 버전 호환성 확인
- Infinispan 9~11 버전에서 유사 사례 다수 보고됨
- 사용 중인 버전의 release notes를 참고하고, 가능하면 최신 안정 버전 사용을 권장
결론
이 에러는 캐시 명령 처리 도중 비트랜잭션 컨텍스트를 트랜잭션 컨텍스트로 잘못 캐스팅하려고 시도했을 때 발생합니다.
따라서 캐시 설정의 일관성, 트랜잭션 사용 여부, 코드 내 트랜잭션 처리 방식 등을 꼼꼼히 점검하는 것이 핵심입니다.
반응형