Обработка асинхронных запросов в SpringBoot Tutorial

Spring Boot

@EnableAsyncаннотация

нужно использовать@Async, сначала нужно использовать@EnableAsyncАннотации включают асинхронные функции в Spring Boot.

@Configuration
@EnableAsync
public class AppConfig {
}

Для получения более подробных инструкций по настройке см.:AsyncConfigurer

@Asyncаннотация

Поддерживаемое использование

(1)Нет. Это метод возврата

ты можешь использовать@AsyncАннотация украшает метод, что указывает на то, что метод вызывается асинхронно. Другими словами, программа возвращается немедленно при вызове этого метода, в то время как фактическое выполнение метода происходит после его отправки в Spring.TaskExecutorв задаче. В простейшем случае вы можете применить аннотацию к методу, возвращающему void, как показано в следующем примере:

@Async
void doSomething() {
    // this will be executed asynchronously
}

(2)Метод с входными параметрами и без возвращаемого значения

Использовать@ScheduledАннотации по-разному аннотируют методы, которые могут указывать параметры, поскольку они вызываются во время выполнения вызывающей стороной «обычным» способом, а не запланированной задачей, управляемой контейнером. Например, следующий код@AsyncЮридические применения аннотаций:

@Async
void doSomething(String s) {
    // this will be executed asynchronously
}

(3)Методы с входными параметрами и возвращаемыми значениями

Даже методы, возвращающие значения, можно вызывать асинхронно. Однако эти методы должны иметьFutureВозвращаемое значение типа. Это по-прежнему обеспечивает преимущества асинхронного выполнения, так что вызывающая сторона может вызыватьFutureВверхget()выполнять другие задачи раньше. В следующем примере показано, как использовать метод, который возвращает значение@Async:

@Async
Future<String> returnSomething(int i) {
    // this will be executed asynchronously
}

Неподдерживаемое использование

@AsyncНе может использоваться с обратными вызовами жизненного цикла, например.@PostConstruct.

Чтобы инициализировать асинхронный bean-компонент Spring, вы должны использовать отдельный bean-компонент Spring для инициализации, а затем вызвать целевой@AsyncАннотированные методы, как показано в следующем примере:

public class SampleBeanImpl implements SampleBean {

    @Async
    void doSomething() {
        // ...
    }

}

public class SampleBeanInitializer {

    private final SampleBean bean;

    public SampleBeanInitializer(SampleBean bean) {
        this.bean = bean;
    }

    @PostConstruct
    public void initialize() {
        bean.doSomething();
    }

}

Явно указать исполнителя

По умолчанию указывается в методе@Async, используемый исполнитель — это исполнитель, который был настроен при включенной поддержке асинхронности, т. е. при использовании XML илиAsyncConfigurerреализация (если есть), тоannotation-drivenэлемент. Однако, если вам нужно указать, что при выполнении данного метода следует использовать исполнителя, отличного от исполнителя по умолчанию, вы можете использовать@AsyncАтрибут value аннотации. В следующем примере показано, как это сделать:

@Async("otherExecutor")
void doSomething(String s) {
    // this will be executed asynchronously by "otherExecutor"
}

В этом случае «otherExecutor» может быть именем любого компонента Executor в контейнере Spring или именем квалификатора, связанного с любым Executor (например, использование<qualifier>Элемент или пружина@Qualifierуказан комментарий) ).

управлять@Asyncисключение

когда@AsyncТип возвращаемого значения метода:Futureтипа, легко управлять исключениями, возникающими во время выполнения метода, потому чтоgetЭто исключение выдается, когда результат. Однако для методов с возвращаемым типом void исключение не перехватывается и не может быть передано. вы можете предоставитьAsyncUncaughtExceptionHandlerдля обработки таких исключений. В следующем примере показано, как это сделать:

public class MyAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler {

    @Override
    public void handleUncaughtException(Throwable ex, Method method, Object... params) {
        // handle exception
    }
}

По умолчанию регистрируются только исключения. ты можешь использовать этоAsyncConfigurerили<task:annotation-driven />Настройка определения XML-элементаAsyncUncaughtExceptionHandler.

Пример

Пример исходного кода:spring-boot-async

использованная литература