60장. Fly에서 인터셉터 체인 조작
초록
인터셉터는 메시지 처리 논리의 일부로 끝점의 인터셉터 체인을 재구성할 수 있습니다. 새 인터셉터를 추가하고, 인터셉터를 제거하고, 인터셉터를 다시 정렬하며, 인터셉터 체인을 일시 중단할 수도 있습니다. 모든 on-the-fly 조작은 호출별로 수행되므로 끝점이 메시지 교환에 참여할 때마다 원래 체인이 사용됩니다.
60.1. 개요
인터셉터 체인은 생성을 분리한 메시지 교환만 있습니다. 각 메시지에는 처리를 담당하는 인터셉터 체인에 대한 참조가 포함되어 있습니다. 개발자는 이 참조를 사용하여 메시지의 인터셉터 체인을 변경할 수 있습니다. 체인은 각 교환기이므로 메시지의 인터셉터 체인에 대한 모든 변경 사항은 다른 메시지 교환에 영향을 미치지 않습니다.
60.2. 체인 라이프 사이클
인터셉터 체인과 체인의 인터셉터는 할당별로 인스턴스화됩니다. 메시지 교환에 참여하도록 엔드포인트를 호출하면 필요한 인터셉터 체인이 인터셉터 인스턴스와 함께 인스턴스화됩니다. 인터셉터 체인 생성을 초래한 메시지 교환이 완료되면 체인 및 인터셉터 인스턴스가 삭제됩니다.
즉, 인터셉터 체인 또는 인터셉터의 필드에 대한 모든 변경 사항은 메시지 교환을 통해 유지되지 않습니다. 따라서 인터셉터를 활성 체인에 배치하는 경우 활성 체인만 적용됩니다. 향후 메시지 교환은 엔드 포인트의 구성에 의해 결정된 대로 초기 상태에서 생성됩니다. 또한 개발자가 향후 메시지 처리를 변경하는 인터셉터에 플래그를 설정할 수 없음을 의미합니다.
인터셉터가 정보를 향후 인스턴스로 전달해야 하는 경우 메시지 컨텍스트에서 속성을 설정할 수 있습니다. 컨텍스트는 메시지 교환을 통해 유지됩니다.
60.3. 인터셉터 체인 가져오기
메시지의 인터셉터 체인을 변경하는 첫 번째 단계는 인터셉터 체인을 가져오는 것입니다. 이 작업은 예 60.1. “인터셉터 체인을 얻는 방법” 에 표시된 Message.getInterceptor Cryostat()
메서드를 사용하여 수행됩니다. 인터셉터 체인은 org.apache.cxf.interceptor.Interceptor Cryostat 오브젝트로 반환됩니다.
예 60.1. 인터셉터 체인을 얻는 방법
InterceptorChain
getInterceptorChain
60.4. 인터셉터 추가
Interceptor Cryostat 오브젝트에는 인터셉터 체인에 인터셉터를 추가하기 위한 예 60.2. “인터셉터 체인에 인터셉터를 추가하는 방법” 에 표시된 두 가지 방법이 있습니다. 하나는 하나의 인터셉터를 추가할 수 있고 다른 하나는 여러 인터셉터를 추가할 수 있습니다.
예 60.2. 인터셉터 체인에 인터셉터를 추가하는 방법
추가
인터셉터<? extends Message
>i
add
Collection<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. 인터셉터 제거
Interceptor Cryostat 오브젝트에는 인터셉터 체인에서 인터셉터를 제거하기 위한 예 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
은 체인에서 제거하려는 인터셉터의 클래스 이름입니다.