Kata pengantar
Artikel ini terutama memperkenalkan konten yang relevan tentang panggilan asinkron Integrasi Spring Boot ke Async. Ini dibagikan untuk referensi dan pembelajaran Anda. Saya tidak akan banyak bicara di bawah ini, mari kita lihat perkenalan yang terperinci bersama.
Apa itu panggilan asinkron?
Panggilan asinkron relatif terhadap panggilan sinkron. Panggilan sinkron merujuk pada program yang dieksekusi langkah demi langkah dalam urutan yang telah ditentukan. Setiap langkah harus dieksekusi sampai langkah sebelumnya dieksekusi. Panggilan asinkron tidak perlu menunggu program sebelumnya dieksekusi.
Metode pemrosesan asinkron
Bagaimana cara mengimplementasikan panggilan asinkron?
Multithreading adalah kata kunci yang dipikirkan banyak orang pada awalnya. Ya, multithreading adalah cara untuk mengimplementasikan panggilan asinkron.
Dalam proyek non-musim semi, kami ingin menerapkan panggilan asinkron adalah menggunakan metode multi-threading, kami dapat mengimplementasikan antarmuka yang dapat dijalankan sendiri atau mengintegrasikan kelas utas, atau menggunakan kumpulan utas pelaksana yang disediakan oleh JDK1.5 atau lebih.
Strngboot menyediakan cara yang sangat nyaman untuk menjalankan panggilan asinkron.
Ikuti contoh resmi
Masukkan kode
Ketergantungan Maven:
<partent> <groupid> org.springframework.boot </groupid> <ArtifactId> Spring-boot-starter-parent </arttifactid> <version> 1.5.3.release </version> </boot> <sependencies> <sgroupid> <sroupid> org.springframework. </dependency> </dependensi>
Mulai kelas: tambahkan anotasi @enableasync
@SpringbootApplication @EnableAsync Aplikasi kelas publik {public static void main (string [] args) {springApplication.run (application.class, args); }}Pengontrol
Cukup tambahkan anotasi @Async pada metode yang Anda butuhkan untuk mengeksekusi secara tidak sinkron
@RestController @RequestMapping ("") Kelas Publik AsynctaskController {@RequestMapping ("") Public String dotask () melempar InterruptedException {long currentTimeMillis = system.currentTimeMillis (); this.task1 (); this.task2 (); this.task3 (); long currentTimeMillis1 = system.currentTimemillis (); Return "Tugas Tugas Total waktu yang dikonsumsi:"+(CurrentTimeMillis1-CurrentTimemillis)+"ms"; } @Async public void Task1 () melempar InterruptedException {long currentTimeMillis = system.currentTimeMillis (); Thread.sleep (1000); long currentTimeMillis1 = system.currentTimemillis (); System.out.println ("Task1 Tugas dikonsumsi:"+(CurrentTimeMillis1-CurrentTimeMillis)+"ms"); } @Async public void Task2 () melempar InterruptedException {long currentTimeMillis = system.currentTimeMillis (); Thread.sleep (2000); long currentTimeMillis1 = system.currentTimemillis (); System.out.println ("Task2 tugas memakan waktu:"+(currentTimeMillis1-CurrentTimemillis)+"ms"); } @Async public void Task3 () melempar InterruptedException {long currentTimeMillis = system.currentTimeMillis (); Thread.sleep (3000); long currentTimeMillis1 = system.currentTimemillis (); System.out.println ("Task3 tugas memakan waktu:"+(currentTimeMillis1-CurrentTimemillis)+"ms"); }}Fungsi utama menjalankan proyek spirngboot. Setelah startup selesai, browser mengakses: http: // localhost: 8080/
Menghibur:
Tugas1 Waktu Tugas: 1012ms Tugas2 Waktu Tugas: 2009MS Tugas3 Waktu Tugas: 3004ms
Setelah menunggu sebentar, output dimasukkan:
Total waktu tugas: 6002ms
Secara tidak sinkron tidak dieksekusi!
Mungkinkah kode itu ditulis secara tidak benar? Saya memeriksanya beberapa kali dan tidak menemukan kesalahan yang jelas. Saya ingat bahwa Spring juga memiliki masalah serupa dengan anotasi @transactional. Ketika Spring memindai kelas dengan metode anotasi @transactional, kelas proxy dihasilkan, dan kelas proxy dimulai dan menutup transaksi. Di kelas yang sama, panggilan metode dijalankan di badan kelas, dan musim semi tidak dapat mencegat panggilan metode ini.
Tiba -tiba, masukkan tugas asinkron ke dalam kelas secara terpisah, dan sesuaikan kode untuk masuk:
Pengontrol
@RequestMapping ("") @RestController kelas publik AsynctaskController {@Autowired private asynctask asynctask; @RequestMapping ("") Public String dotask () melempar interruptedException {long currentTimeMillis = system.currentTimeMillis (); asynctask.task1 (); asynctask.task2 (); asynctask.task3 (); long currentTimeMillis1 = system.currentTimemillis (); kembalikan "tugas tugas total waktu yang memakan waktu:"+(currentTimeMillis1-currentTimemillis)+"ms"; }} Kelas Tugas Asinkron
@Component kelas publik asynctask {@Async public void Task1 () melempar interruptedException {long currentTimeMillis = system.currentTimeMillis (); Thread.sleep (1000); long currentTimeMillis1 = system.currentTimemillis (); System.out.println ("Task1 tugas memakan waktu:"+(currentTimeMillis1-CurrentTimemillis)+"ms"); } @Async public void Task2 () melempar InterruptedException {long currentTimeMillis = system.currentTimeMillis (); Thread.sleep (2000); long currentTimeMillis1 = system.currentTimemillis (); System.out.println ("Task2 tugas memakan waktu:"+(currentTimeMillis1-CurrentTimemillis)+"ms"); } @Async public void Task3 () melempar InterruptedException {long currentTimeMillis = system.currentTimeMillis (); Thread.sleep (3000); long currentTimeMillis1 = system.currentTimemillis (); System.out.println ("Task3 tugas memakan waktu:"+(currentTimeMillis1-CurrentTimemillis)+"ms"); }}Menghibur:
Tugas1 Waktu Tugas: 1012ms Tugas2 Waktu Tugas: 2009MS Tugas3 Waktu Tugas: 3004ms
Masukkan hasil browser:
Total waktu tugas: 19ms
Panggilan asinkron berhasil!
Bagaimana Anda tahu kapan tiga tugas asinkron dieksekusi dan apa hasil eksekusi? Anda dapat menggunakan metode menambahkan panggilan balik faature untuk menilai
Kode dimasukkan:
Kelas Tugas Asinkron
@Component kelas publik ASYNCTASK {@Async Public Future <string> Task1 () melempar InterruptedException {long currentTimeMillis = system.currentTimeMillis (); Thread.sleep (1000); long currentTimeMillis1 = system.currentTimemillis (); System.out.println ("Task1 tugas memakan waktu:"+(currentTimeMillis1-CurrentTimemillis)+"ms"); return asyncresult baru <string> ("Eksekusi Task1 selesai"); } @Async Public Future <string> Task2 () melempar InterruptedException {long currentTimeMillis = system.currentTimeMillis (); Thread.sleep (2000); long currentTimeMillis1 = system.currentTimemillis (); System.out.println ("Task2 tugas memakan waktu:"+(currentTimeMillis1-CurrentTimemillis)+"ms"); return asyncresult baru <string> ("Eksekusi Task2 selesai"); } @Async Public Future <string> Task3 () melempar InterruptedException {long currentTimeMillis = system.currentTimeMillis (); Thread.sleep (3000); long currentTimeMillis1 = system.currentTimemillis (); System.out.println ("Task3 tugas memakan waktu:"+(currentTimeMillis1-CurrentTimemillis)+"ms"); mengembalikan asyncresult baru <string> ("Eksekusi Task3 selesai"); }} Pengontrol
@RequestMapping ("") @RestController kelas publik AsynctaskController {@Autowired private asynctask asynctask; @RequestMapping ("") Public String dotask () melempar interruptedException {long currentTimeMillis = system.currentTimeMillis (); Future <string> Task1 = asynctask.task1 (); Future <string> task2 = asynctask.task2 (); Future <string> Task3 = asynctask.task3 (); Hasil string = null; untuk (;;) {if (task1.isdone () && Task2.isdone () && Task3.isdone ()) {// Ketiga tugasnya dipanggil untuk menyelesaikan, keluar dari loop dan menunggu istirahat; } Thread.sleep (1000); } long currentTimeMillis1 = system.currentTimeMillis (); Hasil = "Total waktu tugas:"+(currentTimeMillis1-CurrentTimemillis)+"ms"; hasil pengembalian; }}Output Konsol:
Tugas1 Waktu Tugas: 1000ms Tugas2 Waktu Tugas: 2001ms Tugas3 Waktu Tugas: 3001MS
Output browser:
Total waktu tugas: 4015ms
Panggilan asinkron berhasil dan program mengembalikan hasilnya hanya ketika semua tugas selesai!
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.