Spring Boot 3 Upgrade Executor: поиск распространения контекста для трассировки микрометра

Я переношу свой проект с версии Spring boot 2.7.4 на версию 3.2.2. мне нужно использовать микрометр вместо сыщика, как мне отредактировать упомянутый ниже BEAN «Executor» для асинхронного режима?
Что мне следует использовать вместо класса LazyTraceExecutor?

@Bean("asyncExecutor")
    public Executor getAsyncExecutor(BeanFactory beanFactory) {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setThreadNamePrefix("Async-");
        executor.setTaskDecorator(new ContextDecorator());
        executor.initialize();

        return new LazyTraceExecutor(beanFactory, executor);
    }
1
0
994
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не нужна замена LazyTraceExecutor.

Следующее должно работать нормально:

@Bean
public TaskDecorator decorator() {
      return new ContextPropagatingTaskDecorator();
}

@Bean
ThreadPoolTaskExecutor executor(ThreadPoolTaskExecutorBuilder builder, TaskDecorator td) {
      return builder.threadNamePrefix("GTX-")
             .taskDecorator(td)
             .build();
}

Спасибо за ответ. Будут ли асинхронные задания собирать информацию для отслеживания?

kernel 26.02.2024 22:33

Да. Вы можете попробовать это.

gtiwari333 27.02.2024 01:52
Ответ принят как подходящий

Я переписал конфигурацию следующим образом:

  1. Я оставил создание ThreadPoolTaskExecutor
@Configuration
public class AppConfiguration {

    @Bean
    public ThreadPoolTaskExecutor micrometerThreadPoolTaskExecutor(AppProperties appConfig) {
        return new TaskExecutorBuilder()
                        .maxPoolSize(appConfig.getThreadPoolMaxSize())
                        .corePoolSize(appConfig.getThreadPoolCoreSize())
                        .threadNamePrefix(appConfig.getThreadPoolPrefix())
                        .build();
    }
}
  1. Конфигурация трассировки микрометра
@Configuration(proxyBeanMethods = false)
public class TracingAsyncConfiguration implements AsyncConfigurer {

    private final ThreadPoolTaskExecutor micrometerTaskExecutor;

    public TracingAsyncConfiguration(@Qualifier("micrometerThreadPoolTaskExecutor") ThreadPoolTaskExecutor micrometerTaskExecutor) {
        this.micrometerTaskExecutor = micrometerTaskExecutor;
    }

    @Override
    public Executor getAsyncExecutor() {
        return ContextExecutorService.wrap(micrometerTaskExecutor.getThreadPoolExecutor(), ContextSnapshotFactory.builder().build()::captureAll);
    }
}

Очень похожий вопрос обсуждался здесь

Ранее я решил проблему, сделав так, как вы сказали, но забыл вникнуть в тему. В любом случае, спасибо за интерес.

kernel 11.06.2024 09:32

Другие вопросы по теме