Hystrix의 격리 정책을 설정하고 RequestContextHolder를 해결합니다.getRequestAttributes () 빈 포인터 예외
1560 단어 Java 문서
Hystrix에는 THREAD 및 SEMAPHORE 등의 격리 정책이 있습니다.
격리 정책이 THREAD일 때 ThreadLocal의 값을 얻을 수 없습니다.예를 들어 다음 코드는 Feign을 사용하여 원격 방법을 호출하려고 하는데, 가져온 (Request Attributes request Attributes = Request Context Holder.get Request Attributes () request Attributes는 Null, 현재 내 feign.hystrix.enabled=true
@Configuration
@Controller
public class FeignRequestConfig {
private static Logger logger = LoggerFactory.getLogger(FeignRequestConfig.class);
@Bean
public RequestInterceptor requestInterceptor(){
RequestInterceptor requestInterceptor = new RequestInterceptor() {
@Override
public void apply(RequestTemplate requestTemplate) {
// requestAttributes null
RequestAttributes requestAttributes =
RequestContextHolder.getRequestAttributes();
if (requestAttributes == null) {
return;
}
}
};
return requestInterceptor;
}
}
해결 방법(시나리오 1)
requestInterceptor가null인 이유는 Hystrix의 기본 격리 정책이THREAD이기 때문입니다.RequestContextHolder 소스에서는 두 개의 ThreadLocal을 사용하여 Hystrix의 기본 격리 정책을 조정합니다.
hystrix.command.default.execution.isolation.strategy=SEMAPHORE
주: 이 방안은 정부에서 추천하는 방안이 아닙니다. 정부에서 사용자 정의 합병 전략을 추천하기 때문에 Hystrix Concurrency Strategy 유형을 계승하고 wrap Callable 방법을 다시 작성해야 합니다. [사용자 정의 합병 전략 방안과 후속으로 인한 문제로 인해 저는 아직 실천을 하지 못했기 때문에 함부로 쓰지 못합니다. 양해, 후속 실천을 한 후에 글을 보충해 주십시오.]