@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