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

關(guān)于springboot響應(yīng)式編程整合webFlux的問題

 更新時(shí)間:2022年01月26日 11:53:40   作者:pshdhx_albert  
在springboot2.x版本中提供了webFlux依賴模塊,該模塊有兩種模型實(shí)現(xiàn):一種是基于功能性端點(diǎn)的方式,另一種是基于SpringMVC注解方式,今天通過本文給大家介紹springboot響應(yīng)式編程整合webFlux的問題,感興趣的朋友一起看看吧

在servlet3.0標(biāo)準(zhǔn)之前,是每一個(gè)請求對應(yīng)一個(gè)線程。如果此時(shí)一個(gè)線程出現(xiàn)了高延遲,就會(huì)產(chǎn)生阻塞問題,從而導(dǎo)致整個(gè)服務(wù)出現(xiàn)嚴(yán)重的性能情況,因?yàn)橐坏┮{(diào)用第三方接口,就有可能出現(xiàn)這樣的操作了。早期的處理方式只能是手工控制線程。

在servlet3.0標(biāo)準(zhǔn)之后,為了解決此類問題,所以提供了異步響應(yīng)的支持。在異步響應(yīng)處理結(jié)構(gòu)中,可以將耗時(shí)操作的部分交由一個(gè)專屬的異步線程進(jìn)行響應(yīng)處理,同時(shí)請求的線程資源將被釋放,并將該線程返回到線程池中,以供其他用戶使用,這樣的操作機(jī)制將極大的提升程序的并發(fā)性能。

對于以上給出的響應(yīng)式編程支持,僅僅是一些原生的支持模式,而現(xiàn)在既然基于springboot程序開發(fā),那么就需要考慮一些更簡單的整合。

而在spring中實(shí)現(xiàn)響應(yīng)式編程,那么則需要使用到spring webFlux,該組件是一個(gè)重新構(gòu)建的且基于Reactive Streams標(biāo)準(zhǔn)實(shí)現(xiàn)的異步非阻塞Web開發(fā)框架,以Reactor開發(fā)框架為基礎(chǔ),可以更加容易實(shí)現(xiàn)高并發(fā)訪問下的請求處理模型。在springboot2.x版本中提供了webFlux依賴模塊,該模塊有兩種模型實(shí)現(xiàn):一種是基于功能性端點(diǎn)的方式,另一種是基于SpringMVC注解方式。

 Maven引入

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

整合處理器:

package com.example.oldguy.myWebFlux.handler;
 
import com.example.oldguy.myVo.Message;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
@Component
@Slf4j
public class MessageHandler {
    public Mono<Message> echoHandler(Message message){
        log.info("【{}】業(yè)務(wù)層接收處理數(shù)據(jù):{}",Thread.currentThread().getName());
        message.setTitle("【】"+Thread.currentThread().getName()+"】"+message.getTitle());
        message.setContent("【】"+Thread.currentThread().getName()+"】"+message.getContent());
        return Mono.create(item->item.success(message)); //實(shí)現(xiàn)數(shù)據(jù)響應(yīng)
    }
}

整合控制器:

package com.example.oldguy.myController;
 
import com.example.oldguy.myVo.Message;
import com.example.oldguy.myWebFlux.handler.MessageHandler;
import com.example.oldguy.mytask.MyThreadTask;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.request.async.DeferredResult;
import javax.servlet.http.HttpServletRequest;
import java.beans.PropertyEditorSupport;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
 * 異步線程的處理機(jī)制
 */
@RestController
@RequestMapping("/message/*")
@Slf4j
@Api(tags = "異步處理")
public class AsyncController {
    @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
    private MyThreadTask task;
    private MessageHandler messageHandler;
    /**
     * 日期轉(zhuǎn)換
     * @param
     * @return
     */
    private static final DateTimeFormatter LOCAL_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    @InitBinder
    public void initBinder(WebDataBinder binder){
        binder.registerCustomEditor(Date.class,new PropertyEditorSupport(){
            @Override
            public void setAsText(String text) throws IllegalArgumentException {
                LocalDate localDate = LocalDate.parse(text,LOCAL_DATE_FORMAT);
                Instant instant = localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
                super.setValue(Date.from(instant));
            }
        });
    }
    @GetMapping("runnable")
    @ApiOperation("異常處理Runnable")
    public Object message(String message) {
        log.info("外部線程:{}", Thread.currentThread().getName());
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        DeferredResult<String> result = new DeferredResult<>(6000L); //設(shè)置異步響應(yīng)
        this.threadPoolTaskExecutor.execute(new Runnable() { //線程核心任務(wù)
            @SneakyThrows
            public void run() {
                log.info("內(nèi)部線程:{}",Thread.currentThread().getName());
                TimeUnit.SECONDS.sleep(7);
                result.setResult("[echo]"+message); //執(zhí)行最終的響應(yīng)
        result.onCompletion(new Runnable() { //完成處理線程
                log.info("完成線程:{}",Thread.currentThread().getName()); //日志輸出
        result.onTimeout(new Runnable() {
                log.info("超時(shí)線程:{}",Thread.currentThread().getName());
                result.setResult("【請求超時(shí)】"+request.getRequestURI()); //超時(shí)路徑
        return  result;
    @GetMapping("task")
    @ApiOperation("task異步任務(wù)開啟")
    public Object messageTask(String message){
        log.info("外部線程{}",Thread.currentThread().getName());
        this.task.startTaskHander();
        return "【echo】"+message;
    @GetMapping("webflux")
    @ApiOperation("整合webflux")
    public Object echo(Message message){
        log.info("接收用戶信息,用戶方發(fā)送的參數(shù)為message={}",message);
        return this.messageHandler.echoHandler(message);
}

頁面響應(yīng):

控制臺(tái)響應(yīng):

2021-11-30 15:04:06.946  INFO 22884 --- [nio-1999-exec-1] c.e.oldguy.myController.AsyncController  : 接收用戶信息,用戶方發(fā)送的參數(shù)為message=Message(title=pansd, pubdate=Tue Nov 30 00:00:00 CST 2021, content=come on baby)
2021-11-30 15:04:06.947  INFO 22884 --- [nio-1999-exec-1] c.e.o.myWebFlux.handler.MessageHandler   : 【http-nio-1999-exec-1】業(yè)務(wù)層接收處理數(shù)據(jù):Message(title=pansd, pubdate=Tue Nov 30 00:00:00 CST 2021, content=come on baby)

 webFlux響應(yīng)map和List

//webFlux響應(yīng)集合
    public Flux<Message> list(Message message){
        List<Message> messageList = new ArrayList<>();
        for(int i=0;i<10;i++){
            Message m = new Message();
            m.setTitle(i+"--"+message.getTitle());
            m.setContent(i+"--"+message.getContent());
            m.setPubdate(message.getPubdate());
            messageList.add(m);
        }
        return Flux.fromIterable(messageList);
    }
    public Flux<Map.Entry<String,Message>> map(Message message){
        Map<String,Message> map = new HashMap<>();
        for(int i=0;i<10;i++){
            Message m = new Message();
            m.setTitle(i+"--"+message.getTitle());
            m.setContent(i+"--"+message.getContent());
            m.setPubdate(message.getPubdate());
            map.put("pansd-"+i,m);
        }
//        Set<Map.Entry<String, Message>> entries = map.entrySet();
        return Flux.fromIterable(map.entrySet());
    }
@GetMapping("webfluxList")
@ApiOperation("整合webfluxList")
public Object echoList(Message message){
    log.info("接收用戶信息,用戶方發(fā)送的參數(shù)為message={}",message);
    return this.messageHandler.list(message);
}
 
@GetMapping("webfluxMap")
@ApiOperation("整合webfluxMap")
public Object echoMap(Message message){
    log.info("接收用戶信息,用戶方發(fā)送的參數(shù)為message={}",message);
    return this.messageHandler.map(message);
}

到此這篇關(guān)于springboot響應(yīng)式編程整合webFlux的文章就介紹到這了,更多相關(guān)springboot響應(yīng)式編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java貪心算法初學(xué)感悟圖解及示例分享

    java貪心算法初學(xué)感悟圖解及示例分享

    這篇文章主要為大家介紹了本人在初學(xué)java貪心算法的感悟,并通過圖解及示例代碼的方式分享給大家,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • Java ThreadLocal有什么作用你知道嗎

    Java ThreadLocal有什么作用你知道嗎

    這篇文章主要為大家詳細(xì)介紹了java ThreadLocal的作用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-09-09
  • Java HttpServletResponse響應(yīng)實(shí)現(xiàn)過程詳解

    Java HttpServletResponse響應(yīng)實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了Java HttpServletResponse響應(yīng)實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java中的Set集合不允許存儲(chǔ)重復(fù)元素的原理詳解

    Java中的Set集合不允許存儲(chǔ)重復(fù)元素的原理詳解

    這篇文章主要介紹了Java中的Set集合不允許存儲(chǔ)重復(fù)元素的原理詳解,我們之前使用Set集合的時(shí)候發(fā)現(xiàn),Set集合的特點(diǎn)是不允許存儲(chǔ)重復(fù)元素,這是為什么呢,下面我們一起來研究一下,需要的朋友可以參考下
    2023-09-09
  • Java8實(shí)戰(zhàn)之Stream的延遲計(jì)算

    Java8實(shí)戰(zhàn)之Stream的延遲計(jì)算

    JDK中Stream的中間函數(shù)如 filter(Predicate super T>)是惰性求值的,filter并非對流中所有元素調(diào)用傳遞給它的Predicate,下面這篇文章主要給大家介紹了關(guān)于Java8實(shí)戰(zhàn)之Stream延遲計(jì)算的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Java分布式session存儲(chǔ)解決方案圖解

    Java分布式session存儲(chǔ)解決方案圖解

    這篇文章主要介紹了Java分布式session存儲(chǔ)解決方案圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Spring-Smart-DI 動(dòng)態(tài)切換實(shí)現(xiàn)類的步驟

    Spring-Smart-DI 動(dòng)態(tài)切換實(shí)現(xiàn)類的步驟

    文章介紹了如何使用spring-smart-di的@AutowiredProxySPI注解來實(shí)現(xiàn)動(dòng)態(tài)切換服務(wù)提供商的功能,通過配置點(diǎn)和代理對象,實(shí)現(xiàn)動(dòng)態(tài)切換而無需重啟服務(wù),感興趣的朋友一起看看吧
    2025-03-03
  • Spring Boot 自動(dòng)配置的實(shí)現(xiàn)

    Spring Boot 自動(dòng)配置的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Boot 自動(dòng)配置的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • java多線程編程同步器Future和FutureTask解析及代碼示例

    java多線程編程同步器Future和FutureTask解析及代碼示例

    這篇文章主要介紹了java多線程編程同步器Future和FutureTask解析及代碼示例,對二者進(jìn)行了詳細(xì)介紹,分析了future的源碼,最后展示了相關(guān)實(shí)例代碼,具有一定參考價(jià)值 ,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot中YAML配置文件實(shí)例詳解

    SpringBoot中YAML配置文件實(shí)例詳解

    前面一直在使用properties配置文件,spring boot也支持yaml配置文件,下面這篇文章主要給大家介紹了關(guān)于SpringBoot中YAML配置文件的相關(guān)資料,需要的朋友可以參考下
    2023-04-04

最新評(píng)論

平乐县| 白银市| 平昌县| 都兰县| 富顺县| 靖州| 皮山县| 拜泉县| 海宁市| 曲松县| 惠水县| 黔西县| 兰溪市| 吉首市| 芦溪县| 浠水县| 岗巴县| 聂拉木县| 汉川市| 政和县| 调兵山市| 陈巴尔虎旗| 宁津县| 新巴尔虎左旗| 拉萨市| 米林县| 西青区| 上蔡县| 义乌市| 洪泽县| 会同县| 尼勒克县| 罗江县| 吕梁市| 丰原市| 青海省| 南陵县| 商城县| 环江| 阿坝县| 渝中区|