Sebelum menggunakan Spring Boot, pendekatan kami adalah menentukan kumpulan tugas dalam file konfigurasi, dan kemudian melempar tugas beranotasi @Async ke dalam kumpulan tugas untuk dieksekusi. Jadi di Spring Boot, cara menerapkan panggilan tugas asinkron, metode ini lebih sederhana.
Mari kita gabungkan yang sebelumnya
Spring Boot Terpadu JMS (Implementasi ActiveMQ)
Kode di blog ini diimplementasikan.
1. Deskripsi fungsi
Ketika seorang konsumen mendengarkan pesan dalam antrian, ia memproses tugas yang menerima pesan sebagai tugas yang tidak sinkron.
2. Modifikasi Kode
Konsumen 1:
paket com.chhliu.springboot.jms; impor org.springframework.jms.annotation.jmslistener; impor org.springframework.scheduling.annotation.async; impor org.springframework.stereotype.component; @Component public class Consumer { @JmsListener(destination = "mytest.queue") @Async //This method will be executed asynchronously, which means the main thread will skip the method directly, but use the thread in the thread pool to execute the method public void receiveQueue(String text) { System.out.println(Thread.currentThread().getName()+": The message received by Consumer is: "+teks); }}Konsumen 2:
paket com.chhliu.springboot.jms; impor org.springframework.jms.annotation.jmslistener; impor org.springframework.messaging.handler.annotation.sendto; impor org.springframework.stereotype.component; @Component Public Class Consumer2 {@jmslistener (Destination = "mytest.queue") @sendto ("out.queue") string public receptQueue (string text) {System.out.println (thread.currentThread (). GetName ()+": pesan yang diterima oleh konsumen2 adalah:"+teks); kembalikan "kembalikan pesan"+teks; }}Tambahkan anotasi berikut ke kelas tes:
paket com.chhliu.springboot.jms; impor javax.jms.destinasi; impor org.apache.activemq.command.activemqqueue; impor org.junit.test; impor org.junit.runner.runwith; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.boot.test.context.springboottest; impor org.springframework.scheduling.annotation.enableasync; impor org.springframework.test.context.junit4.springrunner; @Runwith (springrunner.class) @springboottest @enableasync // Aktifkan tugas asynchronous untuk mendukung kelas publik springbootjmsapplicationTests {@autowired produser swasta; @Test public void contextLoads () melempar interruptedException {destination destination = new ActiveMqqueue ("mytest.queue"); untuk (int i = 0; i <100; i ++) {produser.sendMessage (tujuan, "myName is chhliu !!!"); }}} 3. Hasil tes
DefaultMessAgeListenerContainer-1: Consumer2 Menerima: MyName is Chhliu !!! Pesan balasan yang diterima dari antrian out. Simpleasynctaskexecutor-45: Pesan yang diterima oleh konsumen adalah: myname adalah chhliu !!! DefaultMessAgeListenerContainer-1: Consumer2 Menerima: MyName is Chhliu !!! Pesan balasan yang diterima dari antrian out. Simpleasynctaskexecutor-46: Pesan yang diterima oleh konsumen adalah: myName adalah chhliu !!! DefaultMessAgelistenerContainer-1: Pesan yang diterima oleh konsumen2 adalah: myName adalah chhliu !!! Pesan balasan yang diterima dari antrian out. SimpleAsyncTaskExecutor-47: Pesan yang diterima oleh konsumen adalah: myname adalah chhliu !!! DefaultMessAgelistenerContainer-1: Pesan yang diterima oleh konsumen2 adalah: myName adalah chhliu !!! Pesan balasan yang diterima dari antrian out. Simpleasynctaskexecutor-48: Pesan yang diterima oleh konsumen adalah: myName adalah chhliu !!! DefaultMessAgelistenerContainer-1: Consumer2 IS: MyName is Chhliu !!! Pesan balasan yang diterima dari antrian out. Simpleasynctaskexecutor-49: Pesan yang diterima oleh konsumen adalah: myName adalah chhliu !!! DefaultMessAgelistenerContainer-1: Pesan yang diterima oleh konsumen2 adalah: myName adalah chhliu !!! Pesan balasan yang diterima dari antrian out. SimpleAsyncTaskExecutor-50: Pesan yang diterima oleh konsumen adalah: myName adalah chhliu !!! DefaultMessAgelistenerContainer-1: Pesan yang diterima oleh konsumen2 adalah: myName adalah chhliu !!!
Dari hasil tes di atas, kita dapat melihat bahwa karena konsumen 2 tidak menggunakan metode tugas asinkron, konsumen 2 mengkonsumsi pesan diproses oleh utas tetap defaultMessAgelistenerContainer-1. Konsumen 1 menggunakan metode tugas asinkron, dan setiap kali pesan yang diterima diproses oleh utas yang berbeda. Ketika pesan diterima, tugas dilemparkan langsung ke kumpulan tugas untuk diproses, dan utas utama terus berjalan. Ini juga dapat disimpulkan dari hasil tes bahwa Spring Boot menggunakan kumpulan utas newcachedthreadpool secara default.
Untuk penggunaan kumpulan utas tertentu, silakan merujuk ke posting blog lain dari saya: //www.vevb.com/article/134870.htm
4. Tugas asinkron telah kembali
Dalam pengembangan yang sebenarnya, kita sering menghadapi situasi di mana tugas asinkron kembali. Jadi bagaimana kami mengimplementasikannya di Spring Boot?
Berikut ini adalah contoh pengiriman email asinkron sebagai deskripsi. Kode contoh adalah sebagai berikut:
@Async ("TaskexutePool") // Tugas asinkron akan diserahkan ke kumpulan tugas TaskExecutepool untuk melaksanakan masa depan publik <response> dosendemail (mailinfo mailInfo) {// Tugas asynchronous kembali, gunakan di masa depan <respons> ke asinkron kembali. Metode asinkron disebut! "); Sesi sendmailsession = null; Respons res = respons baru (); boolean isok = sendeMail (mailinfo); // metode spesifik untuk mengirim email jika (isok) {res.setsuccess (true); } else {res.setsuccess (false); } return asyncresult baru <Respess> (res);Bagaimana cara menggunakannya setelah kembali? Kode sampel adalah sebagai berikut:
Future <pespess> hasil = TaskJob.Dosendemail (MailInfo); res = result.get (6, timeunit.seconds);
Dengan cara ini Anda bisa mendapatkan kembalinya tugas asinkron!
Meringkaskan
Di atas adalah metode implementasi penjadwalan tugas Spring Boot Asynchronous (Async) yang diperkenalkan kepada Anda. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!