最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring boot異步(Async)任務(wù)調(diào)度實現(xiàn)方法

 更新時間:2018年02月10日 10:19:11   作者:牛奮lch  
在沒有使用spring boot之前,我們的做法是在配置文件中定義一個任務(wù)池,然后將@Async注解的任務(wù)丟到任務(wù)池中去執(zhí)行,那么在spring boot中,怎么來實現(xiàn)異步任務(wù)的調(diào)用了,下面通過本文給大家講解,需要的朋友參考下

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

我們還是結(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默認使用了newCachedThreadPool線程池來實現(xiàn)。

關(guān)于線程池的具體用法,請參考我的另一篇博文:http://m.fzitv.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ù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • springboot整合token的實現(xiàn)代碼

    springboot整合token的實現(xiàn)代碼

    這篇文章主要介紹了springboot整合token的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Java實現(xiàn)List集合轉(zhuǎn)樹形結(jié)構(gòu)的示例詳解

    Java實現(xiàn)List集合轉(zhuǎn)樹形結(jié)構(gòu)的示例詳解

    在開發(fā)中,我們通常需要將從數(shù)據(jù)庫中查詢的集合數(shù)據(jù)轉(zhuǎn)換成類似文件系統(tǒng)一樣的樹形集合。本文將利用Java語言實現(xiàn)這一功能,感興趣的可以了解一下
    2022-08-08
  • Springboot+Vue+axios實現(xiàn)文章收藏功能

    Springboot+Vue+axios實現(xiàn)文章收藏功能

    這篇文章主要為大家詳細介紹了Springboot+Vue+axios實現(xiàn)文章收藏功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Netty分布式客戶端處理接入事件handle源碼解析

    Netty分布式客戶端處理接入事件handle源碼解析

    這篇文章主要為大家介紹了Netty源碼分析客戶端流程處理接入事件handle創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • Java實現(xiàn)將html字符串插入到PPT幻燈片

    Java實現(xiàn)將html字符串插入到PPT幻燈片

    Java后端代碼操作PPT幻燈片時,可直接在幻燈片中繪制形狀,并在形狀中添加文本字符串內(nèi)容。本篇文章主要介紹通過java實現(xiàn)將html字符串添加到PPT幻燈片的的方法,可添加文字、圖片、視頻、音頻等。以下是具體方法和步驟。
    2021-11-11
  • idea中mapper如何快速跳轉(zhuǎn)到xml插件

    idea中mapper如何快速跳轉(zhuǎn)到xml插件

    這篇文章主要介紹了idea中mapper如何快速跳轉(zhuǎn)到xml插件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • springboot 事件監(jiān)聽的實現(xiàn)方法

    springboot 事件監(jiān)聽的實現(xiàn)方法

    這篇文章主要介紹了springboot 事件監(jiān)聽的實現(xiàn)方法,并詳細的介紹了四種監(jiān)聽方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • Java設(shè)計模式之java原型模式詳解

    Java設(shè)計模式之java原型模式詳解

    這篇文章主要介紹了Java設(shè)計模式之原型模式詳解,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-09-09
  • 在IDEA中實現(xiàn)生成Maven依賴關(guān)系圖

    在IDEA中實現(xiàn)生成Maven依賴關(guān)系圖

    這篇文章主要介紹了在IDEA中實現(xiàn)生成Maven依賴關(guān)系圖方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java設(shè)計模式之備忘錄模式實現(xiàn)對象狀態(tài)的保存和恢復(fù)

    Java設(shè)計模式之備忘錄模式實現(xiàn)對象狀態(tài)的保存和恢復(fù)

    本文介紹Java設(shè)計模式之備忘錄模式,該模式可以實現(xiàn)對象狀態(tài)的保存和恢復(fù)。通過詳細講解備忘錄模式的原理、實現(xiàn)方法和應(yīng)用場景,幫助讀者深入理解該設(shè)計模式,并提供示例代碼和技巧,便于讀者實際應(yīng)用
    2023-04-04

最新評論

花莲县| 奉新县| 慈利县| 沧州市| 诸暨市| 盐亭县| 齐齐哈尔市| 始兴县| 江陵县| 双鸭山市| 红原县| 长治市| 辽宁省| 汉川市| 昌平区| 洛南县| 南安市| 夹江县| 灵武市| 绥化市| 色达县| 新乐市| 汉阴县| 上饶县| 星座| 巴塘县| 兰坪| 婺源县| 静安区| 罗源县| 洪湖市| 兰溪市| 湘潭市| 拜泉县| 阳原县| 蓬溪县| 进贤县| 临城县| 商都县| 漯河市| 海安县|