Heim  >  Artikel  >  Java  >  Burlando oder @Async für Spring

Burlando oder @Async für Spring

王林
王林Original
2024-09-12 10:21:001043Durchsuche

Burlando o @Async do Spring

Beim Erstellen von Anwendungen mit Spring wird häufig die Annotation @EnableAsync verwendet, um asynchrone Ausführungen mit Hilfe von @Async zu ermöglichen Über Methoden machen sie leicht asynchron.

@Async hat grundsätzlich zwei Nutzungsregeln:

  • Die annotierte Methode muss öffentlich sein
  • Der Methodenaufrufer darf nicht aus derselben Klasse stammen

Im folgenden Beispiel wird es keine Kompilierungsprobleme geben, aber die Methode wird (obwohl sie mit @Async annotiert ist) nicht wie gewünscht ausgeführt.

@Slf4j
@Service
@RequiredArgsConstructor
public class HelloService {

    public String get() {
        log.info("Chegou!");
        print();

        return "Ola!";
    }

    @Async
    @SneakyThrows
    public void print() {
        Thread.sleep(Duration.ofSeconds(5));

        log.info("Burlado!");
    }
}

Und es kommt sehr häufig vor, dass wir uns wünschen, dass der Codeblock, der asynchron ausgeführt werden muss, in der Klasse verbleibt, da dies in der Verantwortung der Klasse liegt. Wie löst man es?

Einfach!

Wir müssen nur eine weitere Klasse erstellen, die hilft, zum Beispiel:

@Service
public class AsyncService {

    @Async
    public void run(final Runnable runnable) {
        runnable.run();
    }

    @Async
    public <O> O run(final Supplier<O> supplier) {
        return supplier.get();
    }
}

Wir führen eine Abhängigkeitsinjektion dieser Bean durch, wenn eine asynchrone Ausführung wünschenswert ist, und darüber hinaus können wir die Methode privat machen.

@Slf4j
@Service
@RequiredArgsConstructor
public class HelloService {

    private final AsyncService asyncService;

    public String get() {
        log.info("Chegou!");

        asyncService.run(this::print);

        return "Ola!";
    }

    @SneakyThrows
    private void print() {
        Thread.sleep(Duration.ofSeconds(5));

        log.info("Burlado!");
    }
}

Dieses kleine Beispiel demonstriert die Anwendung mehrerer Konzepte und Ressourcen: Inversion of Control, Dependency Injection, SOLID, Design Pattern, Functional Interfaces.

Das obige ist der detaillierte Inhalt vonBurlando oder @Async für Spring. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn