Изменение Cloud Sleuth с SpringBoot 1.5 до 2.x - PullRequest
0 голосов
/ 22 октября 2018

Ранее этот код работал нормально:

@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
class CustomTraceableExecutorServiceImpl implements ExecutorServiceProvider {

    @Qualifier(value = "defaultExecutorService")
    private final ExecutorService executorService;
    @Qualifier(value = "scheduledTimeoutExecutorService")
    private final ScheduledExecutorService scheduledExecutorService;
    private final Tracer tracer;
    private final SpanNamer spanNamer;

    @Override
    public ExecutorService get() {
        return new TraceableExecutorService(executorService, tracer, new TraceKeys(), spanNamer);
    }

    @Override
    public ScheduledExecutorService getScheduled() {
        return new TraceableScheduledExecutorService(scheduledExecutorService, tracer, new TraceKeys(), spanNamer);
    }
}

Но теперь TraceableExecutorService конструктор занимает TraceableExecutorService(BeanFactory beanFactory, final ExecutorService delegate), поэтому мне нужно изменить код на sth, например:

@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
class CustomTraceableExecutorServiceImpl implements ExecutorServiceProvider {

    @Qualifier(value = "defaultExecutorService")
    private final ExecutorService executorService;
    @Qualifier(value = "scheduledTimeoutExecutorService")
    private final ScheduledExecutorService scheduledExecutorService;
    //@Qualifier(value = "defaultBeanFactory")
    @Autowired
    private final BeanFactory beanFactory;
    //@Qualifier(value = "scheduledBeanFactory")
    @Autowired
    private final BeanFactory scheduledBeanFactory;

    @Override
    public ExecutorService get() {
        return new TraceableExecutorService(beanFactory, executorService);
    }

    @Override
    public ScheduledExecutorService getScheduled() {
        return new TraceableScheduledExecutorService(scheduledBeanFactory, scheduledExecutorService);
    }
}

Проблема, которую яесть около BeanFactory я не знаю, как его создать?У меня нет xml файла, который я мог бы использовать.

Как я прочитал здесь: Каковы различные способы создания beanfactory объекта? Мы можем создать это BeanFactory с помощью:

1. BeanFactory fac=new ClassPathXmlApplicationContext("Spring-Config.xml"); 

2. Resource res=new Classpathresource("Spring-Config.xml");
    BeanFactory fac=new XmlBeanFactory(res);

Как я могу создать его просто, если у меня нет файла xml?Я просто хочу, чтобы мой код был совместим со старой версией (версия SpringBoot 1.5).

1 Ответ

0 голосов
/ 23 октября 2018

Весна создает BeanFactory для вас.Если вы используете контекст Spring, вы получаете его из коробки.Если, однако, по какой-то причине вы не используете Spring, но используете Sleuth (я понятия не имею, зачем вы это делаете), вы можете проверить, что мы используем BeanFactory для получения бинов.BeanFactory - это интерфейс, поэтому вы можете переопределить метод getBean для получения таких компонентов, как:

Tracing tracing() {
        if (this.tracing == null && this.beanFactory != null) {
            this.tracing = this.beanFactory.getBean(Tracing.class);
        }
        return this.tracing;
    }

    SpanNamer spanNamer() {
        if (this.spanNamer == null && this.beanFactory != null) {
            this.spanNamer = this.beanFactory.getBean(SpanNamer.class);
        }
        return this.spanNamer;
    }

Вам нужно смоделировать BeanFactory, чтобы вернуть this.beanFactory.getBean(Tracing.class) и this.beanFactory.getBean(SpanNamer.class)

Но просто с помощью Spring вы получаете все из коробки.Откровенно говоря, я не очень понимаю, что вы делаете.

...