Распространять Spring RequestAttributes (RequestContextHolder) для симуляции конфигурационных бинов? - PullRequest
0 голосов
/ 29 августа 2018

Я использую класс конфигурации Feign, объявленный с помощью таких аннотаций;

@FeignClient(name = "${earfsdf}", configuration = FeignConf.class)

В этом случае FeignConf не является Spring @Configuration, он просто ограничен для этого клиента Feign с использованием приведенной выше аннотации. В FeignConf я объявляю bean-компонент RequestInterceptor;

@Bean
public RequestInterceptor requestInterceptor() {

Это правильно подбирается Feign и вызывается, когда я делаю запрос на клиенте Feign.

Однако я хочу, чтобы этот компонент RequestInterceptor мог обращаться к Spring "RequestAttributes", который я пытаюсь получить, используя RequestContextHolder.getRequestAttributes()

Spring.

Кажется, что когда я вызываю это из RequestInterceptor, он возвращает ноль. Есть ли способ, которым я могу распространять RequestAttributes в Feign RequestInterceptor, чтобы быть доступным?

Спасибо!

1 Ответ

0 голосов
/ 03 сентября 2018

Получается, что ответом на это является использование HystrixCallableWrapper, который позволяет вам обернуть задачу, проходящую через Hystrix (которую я использую с Feign)

Hystrix создает новый поток для вызова Feign. Вызываемая оболочка вызывается в родительском потоке, так что вы можете взять весь необходимый контекст, передать его в новый вызываемый, а затем загрузить контекст внутри вызываемого, который выполняется в новом потоке.

public class ContextAwareCallableWrapper implements HystrixCallableWrapper {

  @Override
  public <T> Callable<T> wrapCallable(Callable<T> callable) {

    Context context = loadContextFromThisThread();

    return new ContextAwareCallable<>(callable, context);
  }

  public static class ContextAwareCallable<T> implements Callable<T> {

    private final Callable<T> callable;
    private Context context;

    ContextAwareCallable(Callable<T> callable, Context context) {
      this.callable = callable;
      this.context = context;
    }

    @Override
    public T call() throws Exception {

      try {
        loadContextIntoNewThread(context);
        return callable.call();
      } finally {
        resetContext();
      }
    }
  }
}
...