60장. Fly에서 Interceptor Chains 조작

초록

인터셉터는 메시지 처리 논리의 일부로 끝점의 인터셉터 체인을 재구성할 수 있습니다. 새 인터셉터를 추가하고 인터셉터를 제거하고 인터셉터를 다시 정렬하고 인터셉터 체인을 일시 중단할 수도 있습니다. 모든 온-The-fly 조작은 호출 특정이므로 원래 체인은 끝점이 메시지 교환에 참여할 때마다 사용됩니다.

60.1. 개요

인터셉터 체인은 메시지가 생성을 스프링하는 동안만 살아 있습니다. 각 메시지에는 처리를 담당하는 인터셉터 체인에 대한 참조가 포함되어 있습니다. 개발자는 이 참조를 사용하여 메시지의 인터셉터 체인을 변경할 수 있습니다. 체인이 변경 당하므로 메시지의 인터셉터 체인에 대한 모든 변경 사항은 다른 메시지 교환에 영향을 미치지 않습니다.

60.2. 체인 라이프사이클

인터셉터 체인 및 체인의 인터셉터는 In-invocation 기준으로 인스턴스화됩니다. 메시지 교환에 참여하도록 끝점이 호출되면 필요한 인터셉터 체인이 인터셉터 인스턴스와 함께 인스턴스화됩니다. 인터셉터 체인 생성을 초래한 메시지 교환이 완료되면 체인과 해당 인터셉터 인스턴스가 삭제됩니다.

즉 인터셉터 체인 또는 인터셉터 필드의 변경 사항은 메시지 교환에서 유지되지 않습니다. 따라서 인터셉터가 활성 체인에 다른 인터셉터를 배치하면 활성 체인만 적용됩니다. 향후의 메시지 교환은 끝점 구성에 의해 결정된 대로 공수 상태에서 생성됩니다. 또한 개발자가 향후 메시지 처리를 변경하는 인터셉터에서 플래그를 설정할 수 없음을 의미합니다.

인터셉터에서 향후 인스턴스에 정보를 전달해야 하는 경우 메시지 컨텍스트에서 속성을 설정할 수 있습니다. 이 컨텍스트는 메시지 교환에 걸쳐 유지됩니다.

60.3. 인터셉터 체인 가져오기

메시지 인터셉터 체인 변경의 첫 번째 단계는 인터셉터 체인을 가져오는 것입니다. 이 작업은 예 60.1. “인터셉터 체인을 가져오는 방법” 에 표시된 Message.getInterceptorChain() 메서드를 사용하여 수행됩니다. 인터셉터 체인은 org.apache.cxf.interceptor.InterceptorChain 오브젝트로 반환됩니다.

예 60.1. 인터셉터 체인을 가져오는 방법

InterceptorChaingetInterceptorChain

60.4. 인터셉터 추가

InterceptorChain 오브젝트에는 인터셉터 체인에 인터셉터를 추가하기 위해 예 60.2. “인터셉터 체인에 인터셉터 추가 방법” 에 표시되는 두 가지 방법이 있습니다. 하나는 단일 인터셉터를 추가할 수 있으며 다른 인터셉터를 사용하면 여러 인터셉터를 추가할 수 있습니다.

예 60.2. 인터셉터 체인에 인터셉터 추가 방법

Interceptor<? extends Message>i addCollection<Interceptor<? extends Message>>i

예 60.3. “on-the-fly 인터셉터 체인에 인터셉터 추가” 메시지의 인터셉터 체인에 단일 인터셉터를 추가하는 코드를 보여줍니다.

예 60.3. on-the-fly 인터셉터 체인에 인터셉터 추가

void handleMessage(Message message)
{
  ...
  AddledIntereptor addled = new AddledIntereptor();
  InterceptorChain chain = message.getInterceptorChain();
  chain.add(addled);
  ...
}

예 60.3. “on-the-fly 인터셉터 체인에 인터셉터 추가” 의 코드는 다음을 수행합니다.

체인에 추가할 인터셉터의 사본을 인스턴스화합니다.

중요

체인에 추가되는 인터셉터는 현재 인터셉터 또는 현재 인터셉터와 동일한 단계에 있어야 합니다.

현재 메시지의 인터셉터 체인을 가져옵니다.

체인에 새 인터셉터를 추가합니다.

60.5. 인터셉터 제거

InterceptorChain 오브젝트에는 인터셉터 체인에서 인터셉터를 제거하기 위해 예 60.4. “인터셉터 체인에서 인터셉터를 제거하는 방법” 에 표시된 하나의 방법이 있습니다.

예 60.4. 인터셉터 체인에서 인터셉터를 제거하는 방법

Interceptor<? extends Message>i

예 60.5. “on-the-fly의 인터셉터 체인에서 인터셉터 제거” 메시지 인터셉터 체인에서 인터셉터를 제거하는 코드를 보여줍니다.

예 60.5. on-the-fly의 인터셉터 체인에서 인터셉터 제거

void handleMessage(Message message)
{
  ...
  Iterator<Interceptor<? extends Message>> iterator =
            message.getInterceptorChain().iterator();
  Interceptor<?> removeInterceptor =  null;
  for (; iterator.hasNext(); ) {
    Interceptor<?> interceptor = iterator.next();
    if (interceptor.getClass().getName().equals("InterceptorClassName")) {
      removeInterceptor = interceptor;
      break;
    }
  }

  if (removeInterceptor !=  null) {
    log.debug("Removing interceptor {}",removeInterceptor.getClass().getName());
    message.getInterceptorChain().remove(removeInterceptor);
  }
  ...
}

여기서 InterceptorClassName 은 체인에서 제거할 인터셉터의 클래스 이름입니다.