검색

60장. Fly에서 Interceptor Chains 조작

download PDF

초록

인터셉터는 메시지 처리 논리의 일부로 끝점의 인터셉터 체인을 재구성할 수 있습니다. 새 인터셉터를 추가하고 인터셉터를 제거하고 인터셉터를 다시 정렬하고 인터셉터 체인을 일시 중단할 수도 있습니다. 모든 온-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 은 체인에서 제거할 인터셉터의 클래스 이름입니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.