1. Eksekusi dan Penjadwalan Tugas
Spring menggunakan antarmuka TaskExecutor dan Taskscheduler untuk memberikan abstraksi untuk tugas eksekusi dan penjadwalan asinkron.
Spring's Taskexecutor sama dengan antarmuka java.util.concurrent.executor. Antarmuka ini hanya memiliki satu metode yang dijalankan (tugas Runnable).
1.1. Jenis Taskexecutor
Spring memiliki banyak implementasi Taskexecutor, dan Anda tidak perlu menerapkannya sendiri:
1.2. Penjadwalan Dukungan Anotasi dan Eksekusi Asinkron
Untuk mengaktifkan dukungan untuk @scheduled dan @Async Annotations Tambahkan @enablesCheduling dan @enableAsync ke salah satu dari Anda
Kelas @configuration:@configuration@enableAsync@enableSchedulingPublic kelas appConfig {}Memberi perhatian khusus
Mode saran default untuk memproses anotasi @Async adalah "proxy" yang memungkinkan gangguan panggilan melalui proxy saja; Panggilan lokal dalam kelas yang sama tidak dapat dicegat seperti itu. Untuk mode interferensi yang lebih maju, pertimbangkan untuk beralih ke mode "AspectJ" dalam kombinasi dengan pengelasan waktu kompilasi atau waktu muat.
Secara default, @Async ditangani dengan proxy. Oleh karena itu, metode di kelas yang sama tidak dapat secara tidak sinkron disebut metode dengan @Async, dan situasi ini masih sinkron.
Misalnya: Berikut ini, memanggil Sayshi () secara langsung secara eksternal dapat dieksekusi secara tidak sinkron, sementara mengatakanHi () masih dieksekusi secara serempak ketika memanggil Sayshello ()
kelas publik A {public void wayshello () {sayhi (); } @Async public void sayshi () {}}1.3. @Async Anotasi
Menambahkan anotasi @Async ke metode ini berarti bahwa ini adalah panggilan asinkron. Dengan kata lain, penelepon metode ini akan segera mendapatkan pengembalian, dan eksekusi metode yang sebenarnya adalah mengirimkan tugas di Taskexecutor Spring.
Dengan kata lain, penelepon akan segera kembali setelah doa dan pelaksanaan metode yang sebenarnya akan terjadi dalam tugas yang telah diserahkan ke Spring Taskexecutor.
@Asyncvoid dosomething () {// Ini akan dieksekusi secara asinkron} @Asyncvoid dosomething (string s) {// Ini akan dieksekusi secara asinkron} @Asyncfuture <string> returnsomething (int i) {// Ini akan dieksekusi secara asinkron}Melihat:
Metode @Async mungkin tidak hanya menyatakan jenis pengembalian java.util.concurrent.
1.4. @Async Limited Executor
Secara default, ketika anotasi @Async ditambahkan ke metode, seorang pelaksana yang mendukung driver anotasi akan digunakan. Namun, nilai nilai anotasi @Async dapat menentukan pelaksana tambahan
@Async ("OtherExecutor") void dosomething (string s) {// Ini akan dieksekusi secara tidak sinkron oleh "otherexecutor"}Di sini, Otherexecutor adalah nama setiap pelaksana kacang di wadah musim semi.
1.5. @Async Exception Management
Ketika metode @Async memiliki nilai pengembalian jenis masa depan, mudah untuk mengelola pengecualian yang dilemparkan saat mengetikkan metode GET () Future untuk mendapatkan hasil eksekusi dari tugas tersebut. Jika tipe pengembalian batal, maka pengecualian tidak akan ditangkap.
Kelas Publik MyAsyncaughtExceptionHandler mengimplementasikan asyncuncaughtExceptionHandler {@Override public void handleuncaughtException (Throwable EX, metode metode, objek ... params) {// menangani pengecualian}} 2. Konfigurasi Benang Pool
impor org.springframework.context.annotation.bean; impor org.springframework.context.annotation.configuration; Impor org.springframework.scheduling.annotation.enableasync; impor org.springframework.scheduling.concurrent.crourrent. kelas taskexecutorconfig {private integer corepoolsize = 30; Private Integer MaxPoolSize = 50; Private Integer Keepaliveseconds = 300; // Private Integer Queuecapacity = 2000; @Bean ("MyThreadPooltaskExecutor") Public ThreadPooltaskExecutor MyThreadPooltaskexecutor () {ThreadPooltaskExecutor Executor = New ThreadPooltaskexecutor (); Executor.setCorepoolSize (corePoolsize); Executor.setMaxPoolSize (MaxPoolSize); executor.setkeepaliveseconds (Keepaliveseconds); // executor.setqueuecapacity (queuecapacity); executor.setwaitfortAskStocompleteonshutdown (true); Executor.Initialize (); Return Executor; }} Panggilan
@Async ("MyThreadPooltaskExecutor") @Override public void present (couponPresentLogentity entitas) {coba {couponBaseresponse rst = Entity.getCoupOnbatchkey () () (),),),),),),),), ENTITY.), ENTITY.GetCouponBatch (), "1" if (null! = rst && rst.issuccess ()) {entity.setstatus (presentstatusenum.success.getType ()); } else {string reason = (null == rst)? "Respons Exception": rst.getmsg (); entity.setFailureason (alasan); entity.setstatus (presentstatusenum.failure.gettype ()); }} catch (exception ex) {log.error (ex.getMessage (), ex); entity.setFailureasoneason (ex.getMessage ()); entity.setstatus (presentstatusenum.failure.gettype ()); } couponPresentLogdao.update (entitas); }hasil
[Info] 2018-05-09 16: 27: 39.887 [mythreadpooltaskexecutor-1] [com.ourhours.coupon.rpc.dubbo.receivelogfilter]-terima metode-nama: kirim; Argumen: [10046031, "4D7CC32F8F7E4B00BCA56F6BF4B3B658", "1", 10001]
[Info] 2018-05-09 16: 27: 39.889 [mythreadpooltaskexecutor-2] [com.ourhours.coupon.rpc.dubbo.receivelogfilter]-terima metode-nama: kirim; Argumen: [10046031, "4D7CC32F8F7E4B00BCA56F6BF4B3B658", "1", 10001]
Lihat:
Dokumentasi Referensi Kerangka Musim Semi 4.3.17.Release
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.