在沒有使用spring boot之前,我們的做法是在配置文件中定義一個任務(wù)池,然后將@Async注解的任務(wù)丟到任務(wù)池中去執(zhí)行,那么在spring boot中,怎么來實現(xiàn)異步任務(wù)的調(diào)用了,方法更簡單。

創(chuàng)新互聯(lián)建站專注于景谷網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供景谷營銷型網(wǎng)站建設(shè),景谷網(wǎng)站制作、景谷網(wǎng)頁設(shè)計、景谷網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造景谷網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供景谷網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
我們還是結(jié)合前面
spring boot整合JMS(ActiveMQ實現(xiàn))
這篇博客里面的代碼來實現(xiàn)。
一、功能說明
消費者在監(jiān)聽到隊列里面的消息時,將接收消息的任務(wù)作為異步任務(wù)處理。
二、代碼修改
消費者1:
package com.chhliu.springboot.jms;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Component
public class Consumer {
@JmsListener(destination = "mytest.queue")
@Async //該方法會異步執(zhí)行,也就是說主線程會直接跳過該方法,而是使用線程池中的線程來執(zhí)行該方法
public void receiveQueue(String text) {
System.out.println(Thread.currentThread().getName()+":Consumer收到的報文為:"+text);
}
} 消費者2:
package com.chhliu.springboot.jms;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Component;
@Component
public class Consumer2 {
@JmsListener(destination = "mytest.queue")
@SendTo("out.queue")
public String receiveQueue(String text) {
System.out.println(Thread.currentThread().getName()+":Consumer2收到的報文為:"+text);
return "return message"+text;
}
} 在測試類上添加如下注解:
package com.chhliu.springboot.jms;
import javax.jms.Destination;
import org.apache.activemq.command.ActiveMQQueue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
@EnableAsync // 開啟異步任務(wù)支持
public class SpringbootJmsApplicationTests {
@Autowired
private Producer producer;
@Test
public void contextLoads() throws InterruptedException {
Destination destination = new ActiveMQQueue("mytest.queue");
for(int i=0; i<100; i++){
producer.sendMessage(destination, "myname is chhliu!!!");
}
}
} 三、測試結(jié)果
DefaultMessageListenerContainer-1:Consumer2收到的報文為:myname is chhliu!!! 從out.queue隊列收到的回復(fù)報文為:return messagemyname is chhliu!!! SimpleAsyncTaskExecutor-45:Consumer收到的報文為:myname is chhliu!!! DefaultMessageListenerContainer-1:Consumer2收到的報文為:myname is chhliu!!! 從out.queue隊列收到的回復(fù)報文為:return messagemyname is chhliu!!! SimpleAsyncTaskExecutor-46:Consumer收到的報文為:myname is chhliu!!! DefaultMessageListenerContainer-1:Consumer2收到的報文為:myname is chhliu!!! 從out.queue隊列收到的回復(fù)報文為:return messagemyname is chhliu!!! SimpleAsyncTaskExecutor-47:Consumer收到的報文為:myname is chhliu!!! DefaultMessageListenerContainer-1:Consumer2收到的報文為:myname is chhliu!!! 從out.queue隊列收到的回復(fù)報文為:return messagemyname is chhliu!!! SimpleAsyncTaskExecutor-48:Consumer收到的報文為:myname is chhliu!!! DefaultMessageListenerContainer-1:Consumer2收到的報文為:myname is chhliu!!! 從out.queue隊列收到的回復(fù)報文為:return messagemyname is chhliu!!! SimpleAsyncTaskExecutor-49:Consumer收到的報文為:myname is chhliu!!! DefaultMessageListenerContainer-1:Consumer2收到的報文為:myname is chhliu!!! 從out.queue隊列收到的回復(fù)報文為:return messagemyname is chhliu!!! SimpleAsyncTaskExecutor-50:Consumer收到的報文為:myname is chhliu!!! DefaultMessageListenerContainer-1:Consumer2收到的報文為:myname is chhliu!!!
從上面的測試結(jié)果可以看出,由于消費者2沒有使用異步任務(wù)方式,所以消費者2消費消息都是由固定的線程DefaultMessageListenerContainer-1這個線程來處理的,而消費者1由于使用了異步任務(wù)的方式,每次處理接收到的消息都是由不同的線程來處理的,當(dāng)接收到消息時,直接將任務(wù)丟到任務(wù)池中去處理,而主線程則繼續(xù)跑,從測試結(jié)果中還可以推斷出,spring boot默認(rèn)使用了newCachedThreadPool線程池來實現(xiàn)。
關(guān)于線程池的具體用法,請參考我的另一篇博文:https://www.jb51.net/article/134870.htm
四、異步任務(wù)有返回
在實際的開發(fā)中,我們會經(jīng)常遇到異步任務(wù)有返回的情況,那么在spring boot中,怎么來實現(xiàn)了?
下面以異步發(fā)郵件為例,來進行說明,示例代碼如下:
@Async("taskExecutePool") // 異步任務(wù)會提交到taskExecutePool任務(wù)池中執(zhí)行
public Future<Response> doSendEmail(MailInfo mailInfo) {// 異步任務(wù)返回,使用Future<Response>來異步返回
log.info(Thread.currentThread().getName()+"調(diào)用了doSendEmail異步方法!");
SendMailSession session = null;
Response res = new Response();
boolean isOK = sendEmail(mailInfo);// 具體發(fā)郵件的方法
if(isOK){
res.setSuccess(true);
}else{
res.setSuccess(false);
}
return new AsyncResult<Response>(res); 返回之后怎么使用?示例代碼如下:
Future<Response> result = taskJob.doSendEmail(mailInfo); res = result.get(6, TimeUnit.SECONDS);
這樣就可以獲取到異步任務(wù)的返回了!
總結(jié)
以上所述是小編給大家介紹的spring boot異步(Async)任務(wù)調(diào)度實現(xiàn)方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對創(chuàng)新互聯(lián)網(wǎng)站的支持!
網(wǎng)頁題目:springboot異步(Async)任務(wù)調(diào)度實現(xiàn)方法
轉(zhuǎn)載源于:http://www.chinadenli.net/article12/gghsgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、網(wǎng)站建設(shè)、App設(shè)計、品牌網(wǎng)站制作、網(wǎng)站制作、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)