Application Servers & Java

Infinispan ClassCastException – SingleKeyNonTxInvocationContext → TxInvocationContext 변환 오류

midworker 2025. 5. 19. 22:30
반응형

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)인 경우에 발생합니다.

주요 원인

  1. 트랜잭션 미설정된 상태에서 트랜잭션 기반 명령 실행

    • 캐시에 transactional=true로 설정했으나, 실제 호출 시 트랜잭션이 시작되지 않음
    • 또는 클라이언트 코드에서 트랜잭션을 생략하고 호출
  2. 캐시 구성 불일치

    • 클러스터 노드 간 Infinispan 설정이 다르거나, 일부 노드에만 트랜잭션 설정이 적용된 경우
  3. 버전 호환성 문제

    • 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를 참고하고, 가능하면 최신 안정 버전 사용을 권장

결론

이 에러는 캐시 명령 처리 도중 비트랜잭션 컨텍스트를 트랜잭션 컨텍스트로 잘못 캐스팅하려고 시도했을 때 발생합니다.
따라서 캐시 설정의 일관성, 트랜잭션 사용 여부, 코드 내 트랜잭션 처리 방식 등을 꼼꼼히 점검하는 것이 핵심입니다.


반응형