1. Aufgabenausführung und -planung
Spring verwendet die Taskexecutor- und TaskScheduler -Schnittstellen, um Abstraktionen für asynchrone Ausführung und Planungsaufgaben bereitzustellen.
Der Taskexecutor von Spring ist der gleiche wie die Schnittstelle java.util.concurrent.executor. Diese Schnittstelle hat nur eine Methode Ausführung (Runnable -Aufgabe).
1.1. Taskexecutor -Typ
Spring hat viele Taskexecutor-Implementierungen integriert, und Sie müssen sie nicht selbst implementieren:
1.2. Anmerkungen unterstützen die Planung und die asynchrone Ausführung
Um Unterstützung für @Scheduled und @Async -Anmerkungen zu ermöglichen, fügen Sie @EnablesScharning und @EnableAsync zu einem Ihrer hinzu
@Configuration Klassen:@configuration@enableAsync@enableSchedulingPublic Class AppConfig {}Besondere Aufmerksamkeit achten
Der Standardberatungsmodus für die Verarbeitung von @Async -Anmerkungen ist "Proxy", die nur die Störung von Aufrufen über den Proxy ermöglicht. Lokale Anrufe innerhalb derselben Klasse können nicht so abgefangen werden. Für einen fortgeschritteneren Interferenzmodus wechseln Sie in Kombination mit Kompilierungszeit- oder Ladezeitschweißen in den "Aspektjodus".
Standardmäßig wird @Async mit Proxy behandelt. Daher können Methoden in derselben Klasse nicht asynchron als Methoden mit @aSync bezeichnet werden, und diese Situation ist immer noch synchron.
Zum Beispiel: Das Folgende kann Sayshi () direkt extern asynchron ausgeführt werden, während Sayhi () beim Aufrufen von SayShello () immer noch synchron ausgeführt wird.
public class a {public void sayshello () {Sayhi (); } @ASync public void Sayshi () {}}1.3. @ASync Annotation
Hinzufügen von @Async -Annotation zur Methode bedeutet, dass dies ein asynchroner Anruf ist. Mit anderen Worten, der Anrufer der Methode erhält die Rückgabe sofort, und die tatsächliche Methodenausführung besteht darin, eine Aufgabe im Taskexecutor von Spring einzureichen.
Mit anderen Worten, der Anrufer kehrt sofort nach dem Aufruf zurück und die tatsächliche Ausführung der Methode erfolgt in einer Aufgabe, die einem Spring Taskexecutor übermittelt wurde.
@Asyncvoid dosomething () {// Dies wird asynchron ausgeführt} @ASyncvoid dosomethething (String s) {// Dies wird asynchron ausgeführt} @Asyncfuture <string> returnSomething (int i) {// Dies wird asynchron ausgeführt}Beachten:
@Async -Methoden deklarieren möglicherweise nicht nur einen regulären java.util.concurrent.future -Rückkehrtyp, sondern auch den Frühling org.springframework.util.concurrent
1.4. @ASync Limited Executor
Wenn die Methode hinzugefügt wird, wird standardmäßig ein Testamentsvollstrecker verwendet, der den Annotationstreiber unterstützt. Der Wertwert der @Async -Annotation kann jedoch einen zusätzlichen Ausführern angeben
@ASync ("oTherexexecutor") void Dosenthing (String S) {// Dies wird asynchron von "oTherexecutor"} ausgeführtHier ist anderexzierin der Name einer Beeinträchtigung des Testamentsvollstreckers im Frühlingscontainer.
1.5. @ASync Exception Management
Wenn eine @aSync -Methode einen Rückgabewert des zukünftigen Typs hat, ist es einfach, die Ausnahme zu verwalten, wenn die Get () -Methode von Future 'Get () das Ausführungsergebnis der Aufgabe tippt. Wenn der Rückgabetyp ungültig ist, wird die Ausnahme nicht gefangen.
öffentliche Klasse myasyncuncaughtexceptionHandler implementiert asyncungaugtexceptionHandler {@Override public void handleCaughtexception (Throwable Ex, Methode Methode, Objekt ... Params) {// Ausnahme}} 2. Konfiguration der Threadpool
import org.springframework.context.annotation.bean; import org.springframework.context.annotation Taskexecutorconfig {private Integer corepoolsize = 30; private Ganzzahl maxpoolsize = 50; Private Ganzzahl keepaliveseconds = 300; // Private Ganzzahl Queuecapacity = 2000; @Bean ("MyThreadpooltaskexeCutor") public threadpooltasexecutor mytheadpooltasexecutor () {threadpooltaskexecutor executor = new threadpooltaskexecutor (); Executor.SetCorepoolSize (CorepoolSize); executor.setMaxpoolSize (maxpoolsize); Executor.SetkeepaliveSeconds (KeepaliveSeconds); // Executor.Setqueecapacity (Queuecapacity); Executor.SetwaitFortaskStocompleteonShutdown (true); Executor.initialize (); Rückgabereiter; }} Anruf
@Async("myThreadPoolTaskExecutor") @Override public void present(CouponPresentLogEntity entity) { try { CouponBaseResponse rst = couponSendRpcService.send(entity.getUserId(), entity.getCouponBatchKey(), "1", entity.getVendorId()); if (null! } else {String reage = (null == rst)? "Antwortausnahme": rst.getMsg (); Entity.SetFailurerasaison (Grund); entity.setStatus (PresentatuSenum.Failure.GetType ()); }} catch (Ausnahme ex) {log.Error (ex.getMessage (), ex); Entity.SetFailurerasaison (ex.getMessage ()); entity.setStatus (PresentatuSenum.Failure.GetType ()); } CouponPresentLogDao.Update (Entity); }Ergebnis
[Info] 2018-05-09 16: 27: 39.887 [Mytheadpooltaskexecutor-1] [com.ourHours.Coupon.rpc.dubbo.receivelogfilter]-Empfangen-Methode-Name: Senden; Argumente: [10046031, "4D7CC32F8F7E4B00BCA56F6BF4B3B658", "1", 10001]
[Info] 2018-05-09 16: 27: 39.889 [Mytheadpooltaskexecutor-2] [com.ourHours.Coupon.rpc.dubbo.receivelogFilter]-Empfangen-Methode-Namen erhalten: Send; Argumente: [10046031, "4D7CC32F8F7E4B00BCA56F6BF4B3B658", "1", 10001]
Siehe:
Spring Framework Referenzdokumentation 4.3.17.Release
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.