亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

我們還是結(jié)合前面

spring boot整合JMS(ActiveMQ實(shí)現(xiàn))

這篇博客里面的代碼來(lái)實(shí)現(xiàn)。

一、功能說(shuō)明

消費(fèi)者在監(jiān)聽(tīng)到隊(duì)列里面的消息時(shí),將接收消息的任務(wù)作為異步任務(wù)處理。

二、代碼修改

消費(fèi)者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 //該方法會(huì)異步執(zhí)行,也就是說(shuō)主線程會(huì)直接跳過(guò)該方法,而是使用線程池中的線程來(lái)執(zhí)行該方法 
 public void receiveQueue(String text) { 
  System.out.println(Thread.currentThread().getName()+":Consumer收到的報(bào)文為:"+text); 
 } 
} 

消費(fèi)者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收到的報(bào)文為:"+text); 
  return "return message"+text; 
 } 
} 

在測(cè)試類上添加如下注解:

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 // 開(kāi)啟異步任務(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!!!"); 
  } 
 } 
} 

三、測(cè)試結(jié)果 

DefaultMessageListenerContainer-1:Consumer2收到的報(bào)文為:myname is chhliu!!! 
從out.queue隊(duì)列收到的回復(fù)報(bào)文為:return messagemyname is chhliu!!! 
SimpleAsyncTaskExecutor-45:Consumer收到的報(bào)文為:myname is chhliu!!! 
DefaultMessageListenerContainer-1:Consumer2收到的報(bào)文為:myname is chhliu!!! 
從out.queue隊(duì)列收到的回復(fù)報(bào)文為:return messagemyname is chhliu!!! 
SimpleAsyncTaskExecutor-46:Consumer收到的報(bào)文為:myname is chhliu!!! 
DefaultMessageListenerContainer-1:Consumer2收到的報(bào)文為:myname is chhliu!!! 
從out.queue隊(duì)列收到的回復(fù)報(bào)文為:return messagemyname is chhliu!!! 
SimpleAsyncTaskExecutor-47:Consumer收到的報(bào)文為:myname is chhliu!!! 
DefaultMessageListenerContainer-1:Consumer2收到的報(bào)文為:myname is chhliu!!! 
從out.queue隊(duì)列收到的回復(fù)報(bào)文為:return messagemyname is chhliu!!! 
SimpleAsyncTaskExecutor-48:Consumer收到的報(bào)文為:myname is chhliu!!! 
DefaultMessageListenerContainer-1:Consumer2收到的報(bào)文為:myname is chhliu!!! 
從out.queue隊(duì)列收到的回復(fù)報(bào)文為:return messagemyname is chhliu!!! 
SimpleAsyncTaskExecutor-49:Consumer收到的報(bào)文為:myname is chhliu!!! 
DefaultMessageListenerContainer-1:Consumer2收到的報(bào)文為:myname is chhliu!!! 
從out.queue隊(duì)列收到的回復(fù)報(bào)文為:return messagemyname is chhliu!!! 
SimpleAsyncTaskExecutor-50:Consumer收到的報(bào)文為:myname is chhliu!!! 
DefaultMessageListenerContainer-1:Consumer2收到的報(bào)文為:myname is chhliu!!! 

從上面的測(cè)試結(jié)果可以看出,由于消費(fèi)者2沒(méi)有使用異步任務(wù)方式,所以消費(fèi)者2消費(fèi)消息都是由固定的線程DefaultMessageListenerContainer-1這個(gè)線程來(lái)處理的,而消費(fèi)者1由于使用了異步任務(wù)的方式,每次處理接收到的消息都是由不同的線程來(lái)處理的,當(dāng)接收到消息時(shí),直接將任務(wù)丟到任務(wù)池中去處理,而主線程則繼續(xù)跑,從測(cè)試結(jié)果中還可以推斷出,spring boot默認(rèn)使用了newCachedThreadPool線程池來(lái)實(shí)現(xiàn)。

關(guān)于線程池的具體用法,請(qǐng)參考我的另一篇博文:http://chabaoo.cn/article/134870.htm

四、異步任務(wù)有返回

在實(shí)際的開(kāi)發(fā)中,我們會(huì)經(jīng)常遇到異步任務(wù)有返回的情況,那么在spring boot中,怎么來(lái)實(shí)現(xiàn)了?

下面以異步發(fā)郵件為例,來(lái)進(jìn)行說(shuō)明,示例代碼如下:

@Async("taskExecutePool") // 異步任務(wù)會(huì)提交到taskExecutePool任務(wù)池中執(zhí)行 
 public Future<Response> doSendEmail(MailInfo mailInfo) {// 異步任務(wù)返回,使用Future<Response>來(lái)異步返回 
  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)度實(shí)現(xiàn)方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java中Map和Set的常見(jiàn)用法舉例

    Java中Map和Set的常見(jiàn)用法舉例

    Map和Set是一種專門用來(lái)進(jìn)行搜索的容器或者數(shù)據(jù)結(jié)構(gòu),其具體效率與具體的實(shí)例化子類有關(guān),下面這篇文章主要給大家介紹了關(guān)于Java中Map和Set的常見(jiàn)用法,需要的朋友可以參考下
    2024-04-04
  • java.lang.NullPointerException異常問(wèn)題解決方案

    java.lang.NullPointerException異常問(wèn)題解決方案

    這篇文章主要介紹了java.lang.NullPointerException異常問(wèn)題解決方案,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Netty進(jìn)階之EventExecutorGroup源碼詳解

    Netty進(jìn)階之EventExecutorGroup源碼詳解

    這篇文章主要介紹了Netty進(jìn)階之EventExecutorGroup源碼詳解,EventExecutorGroup繼承了JDK的ScheduledExecutroService,那么它就擁有了執(zhí)行定時(shí)任務(wù),執(zhí)行提交的普通任務(wù),需要的朋友可以參考下
    2023-11-11
  • 數(shù)據(jù)庫(kù)連接池c3p0配置_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    數(shù)據(jù)庫(kù)連接池c3p0配置_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了數(shù)據(jù)庫(kù)連接池c3p0配置的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • IDEA中配置Java反編譯工具javap -c的使用

    IDEA中配置Java反編譯工具javap -c的使用

    本文主要介紹了IDEA中配置Java反編譯工具javap -c的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • springcloud LogBack日志使用詳解

    springcloud LogBack日志使用詳解

    這篇文章主要介紹了springcloud LogBack日志使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Component和Configuration注解區(qū)別實(shí)例詳解

    Component和Configuration注解區(qū)別實(shí)例詳解

    這篇文章主要為大家介紹了Component和Configuration注解區(qū)別實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 關(guān)于File與MultipartFile的用法概述

    關(guān)于File與MultipartFile的用法概述

    這篇文章主要介紹了關(guān)于File與MultipartFile的用法概述,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • spring @Component注解原理解析

    spring @Component注解原理解析

    這篇文章主要介紹了spring @Component注解原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 一種新的日期處理方式之JavaScript Temporal API

    一種新的日期處理方式之JavaScript Temporal API

    JavaScript Temporal API是一種為Web開(kāi)發(fā)人員提供了一種新的處理日期和時(shí)間數(shù)據(jù)類型的方式。它的目的是使操作日期和時(shí)間更加簡(jiǎn)單和可靠,而且不用擔(dān)心歷史時(shí)區(qū)問(wèn)題或全球化協(xié)調(diào)時(shí)間(UTC)之類的問(wèn)題,感興趣的同學(xué)可以參考閱讀
    2023-05-05

最新評(píng)論