91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Spring Boot 3.2支持虛擬線程和原生鏡像

jf_ro2CN3Fa ? 來源:medium.com ? 2023-11-30 16:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

來源:medium.com/@egorponomarev

Spring Boot 3.2 前幾日發(fā)布,讓我們用 Java 21、GraalVM 和虛擬線程來嘗試一下。

Spring Boot 3.2 支持:

Java 21

虛擬線程

原生鏡像(自 2022 年 11 月 Spring Boot 3.0 發(fā)布以來,Spring Boot 已在生產環(huán)境中支持 GraalVM 原生鏡像)

Java 21

我們期待 2023 年 9 月 19 日發(fā)布的 Java 21,Spring Boot 3.2 已經做到完全支持了。

正如所聲明的那樣,Java 21 提供了數千項性能、穩(wěn)定性和安全性改進,包括平臺增強功能,可幫助開發(fā)人員提高生產力并推動整個組織的創(chuàng)新和增長。

虛擬線程

更重要的更新之一是虛擬線程,這是 Project Loom 提供的功能。我們不打算深入細節(jié),官方 JEP 提供了很好的解釋:

GraalVM 和本機鏡像

GraalVM 是一種高性能 JDK,可以使用替代的即時 (JIT) 編譯器來加快 Java 和基于 JVM 的應用程序的性能。

Native Image 是一種提前將 Java 代碼編譯為獨立可執(zhí)行文件(稱為本機映像)的技術。該可執(zhí)行文件包括應用程序類、其依賴項中的類、運行時庫類以及來自 JDK 的靜態(tài)鏈接本機代碼。

它不在 Java VM 上運行,但包含來自不同運行時系統(tǒng)的必要組件,如內存管理、線程調度等。與 JVM 相比,生成的程序具有更快的啟動時間和更低的運行時內存開銷。

嘗鮮一下

讓我們從安裝 Java 21.0.1 graal 開始,最簡單的方法是使用SDKMAN 并將其指定為您機器的默認 Java 版本:

sdk install java 21.0.1-graal

sdk default java 21.0.1-graal

另一種安裝方法是手動下載

我們將使用Spring Initializr頁面創(chuàng)建一個新的Spring Boot項目,使用 Spring Boot 3.2.0、Java 21、Gradle-Groovy以及Spring Web和GraalVM本地支持依賴項。

要在 Spring Boot 3.2 中啟用虛擬線程,我們只需在 application.yml 或 application.properties 文件中設置一個屬性:

spring.threads.virtual.enabled:true

這個配置起到的作用:

Tomcat 將使用虛擬線程來處理 HTTP 請求。這意味著處理 Web 請求的應用程序代碼(例如控制器中的方法)將在虛擬線程上運行。

調用@Async方法時,Spring MVC 的異步請求處理和 Spring WebFlux 的阻塞執(zhí)行支持現在將利用虛擬線程

標記有@Scheduled的方法將在虛擬線程上運行

因此,我們將嘗試使用這 3 個集成來實現虛擬線程。

此外,一些特定的集成將在虛擬線程上工作,例如 RabbitMQ/Kafka 監(jiān)聽器,以及 Spring Data Redis/Apache pulsar 相關的集成。但這些集成超出了本文的范圍,有興趣的可以參考 Spring Boot 3.2 官方示例。

代碼

1.對于 Tomcat 傳入的 HTTP 請求,我們創(chuàng)建一個簡單的控制器:

@RestController
@RequestMapping("/test")
publicclassTestController{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(TestController.class);

@GetMapping
publicvoidtest(){
log.info("Restcontrollermethodhasbeencalled{}",Thread.currentThread());
}
}

2.異步任務

我們將在應用程序啟動時調用其“run”方法

@Component
publicclassAsyncTaskExecutorService{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(AsyncTaskExecutorService.class);

@Async
publicvoidrun(){
log.info("Asynctaskmethodhasbeencalled{}",Thread.currentThread());
}
}

3.Scheduled 定時任務

一個簡單的方法,每 15 秒調用一次

@Component
publicclassSchedulerService{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(SchedulerService.class);

@Scheduled(fixedDelayString="15000")
publicvoidrun(){
log.info("Scheduledmethodhasbeencalled{}",Thread.currentThread());
}
}

讓我們運行我們的應用程序:

./gradlewbootRun

并調用我們的端點

curl—位置—請求GET'localhost:8085/test'

我們得到什么:

StartingAppApplicationusingJava21.0.1withPID38126
StartedAppApplicationin1.131seconds(processrunningfor1.491)
AsynctaskmethodhasbeencalledVirtualThread[#52,task-1]/runnable@ForkJoinPool-1-worker-5
ScheduledmethodhasbeencalledVirtualThread[#46,scheduling-1]/runnable@ForkJoinPool-1-worker-1
RestcontrollermethodhasbeencalledVirtualThread[#62,tomcat-handler-0]/runnable@ForkJoinPool-1-worker-1
ScheduledmethodhasbeencalledVirtualThread[#46,scheduling-1]/runnable@ForkJoinPool-1-worker-1

我們可以看到我們的方法的日志鏈接到公共 ForkJoinPool 線程池。

根據JEP:預期行為:

JDK 的虛擬線程調度程序是一個工作竊取的 ForkJoinPool,它以 FIFO 模式運行。調度程序的并行度是可用于調度虛擬線程的平臺線程的數量。

現在讓我們在 GraalVM 上運行它。

首先,我們需要構建一個 GraalVM 本機映像:(此命令可能需要幾分鐘)然后運行:(使用您的應用程序的名稱而不是“app”)

./gradlewnativeCompile

./build/native/nativeComplie/app

它也可以工作,并且啟動時間要快得多,這符合聲明的“與 JVM 相比,生成的程序具有更快的啟動時間和更低的運行時內存開銷”。

在這里您可以找到包含本文中使用的代碼的存儲庫來源

結論

Spring Boot 3.2 是我們一直在等待的東西!具有虛擬線程的本機映像允許我們編寫能夠提供與 Go 類似級別的性能和可擴展性的代碼,從而保持 JVM 的強大生態(tài)系統(tǒng)。

但是,您必須考慮到并非所有庫都已采用其代碼來與虛擬線程正常工作(在大多數情況下,它正在用 ReentrantLock 替換“synchronize”塊),您應該小心虛擬線程將使用的邏輯。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    3001

    瀏覽量

    116411
  • 線程
    +關注

    關注

    0

    文章

    509

    瀏覽量

    20825
  • 鏡像
    +關注

    關注

    0

    文章

    180

    瀏覽量

    11641
  • SpringBoot
    +關注

    關注

    0

    文章

    177

    瀏覽量

    684

原文標題:Spring Boot 3.2 正式發(fā)布,開箱即用的虛擬線程和 GraalVM,嘗鮮一下!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Spring Boot如何實現異步任務

    ,用來告訴 Spring 這個方法是一個異步方法,Spring 會將這個方法的執(zhí)行放在異步線程中進行。使用 @Async 注解需要滿足以下條件: 需要在 Spring
    的頭像 發(fā)表于 09-30 10:32 ?2147次閱讀

    Spring Boot虛擬線程和Webflux性能對比

    早上看到一篇關于Spring Boot虛擬線程和Webflux性能對比的文章,覺得還不錯。內容較長,抓重點給大家介紹一下這篇文章的核心內容,方便大家快速閱讀。
    發(fā)表于 09-24 14:54 ?1751次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b><b class='flag-5'>虛擬</b><b class='flag-5'>線程</b>和Webflux性能對比

    使用Spring Boot 3.2虛擬線程搭建靜態(tài)文件服務器

    Spring Boot 3.2 于 2023 年 11 月大張旗鼓地發(fā)布,標志著 Java 開發(fā)領域的一個關鍵時刻。這一突破性的版本引入了一系列革命性的功能。
    的頭像 發(fā)表于 01-09 09:34 ?1851次閱讀
    使用<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> <b class='flag-5'>3.2</b><b class='flag-5'>虛擬</b><b class='flag-5'>線程</b>搭建靜態(tài)文件服務器

    請問6455支持對16位flash操作嗎?

    求教!最近在使用6455,EMIF的CE3空間接了16位的flash用來boot程序。第一個問題6455支持對16位flash操作嗎?我用的異步16位通信方式,不能正確操作flash,我從網上沒有
    發(fā)表于 01-22 07:42

    CH9121的虛擬串口軟件在哪?CH9120支持嗎?

    CH9121的虛擬串口軟件在哪?CH9120支持
    發(fā)表于 10-17 06:45

    Spring Boot從零入門1 詳述

    在開始學習Spring Boot之前,我之前從未接觸過Spring相關的項目,Java基礎還是幾年前自學的,現在估計也忘得差不多了吧,寫Spring
    的頭像 發(fā)表于 12-10 22:18 ?1144次閱讀

    Spring Boot特有的實踐

    Spring Boot是最流行的用于開發(fā)微服務的Java框架。在本文中,我將與你分享自2016年以來我在專業(yè)開發(fā)中使用Spring Boot所采用的最佳實踐。這些內容是基于我的個人經驗
    的頭像 發(fā)表于 09-29 10:24 ?1548次閱讀

    強大的Spring Boot 3.0要來了

    和 Bugfix。 Spring Boot 3.0 的開發(fā)工作始于實驗性的 Spring Native,旨在為 GraalVM 原生鏡像提供
    的頭像 發(fā)表于 10-31 11:17 ?2830次閱讀

    用這4招 優(yōu)雅的實現Spring Boot異步線程間數據傳遞

    Spring Boot 自定義線程池實現異步開發(fā)相信看過陳某的文章都了解,但是在實際開發(fā)中需要在父子線程之間傳遞一些數據,比如用戶信息,鏈路信息等等
    的頭像 發(fā)表于 01-30 10:40 ?1705次閱讀

    Spring Boot Web相關的基礎知識

    上一篇文章我們已經學會了如何通過IDEA快速建立一個Spring Boot項目,還介紹了Spring Boot項目的結構,介紹了項目配置文件pom.xml的組成部分,并且撰寫了我們
    的頭像 發(fā)表于 03-17 15:03 ?1287次閱讀

    Spring干掉原生JVM?

    這意味著,除了 Spring 誕生以來就支持的 Java 虛擬機,官方添加了使用 GraalVM 將 Spring 應用編譯成原生
    的頭像 發(fā)表于 05-05 09:25 ?1213次閱讀
    <b class='flag-5'>Spring</b>干掉<b class='flag-5'>原生</b>JVM?

    Spring Boot Actuator快速入門

    不知道大家在寫 Spring Boot 項目的過程中,使用過 Spring Boot Actuator 嗎?知道 Spring
    的頭像 發(fā)表于 10-09 17:11 ?1299次閱讀

    Spring Boot啟動 Eureka流程

    在上篇中已經說過了 Eureka-Server 本質上是一個 web 應用的項目,今天就來看看 Spring Boot 是怎么啟動 Eureka 的。 Spring Boot 啟動 E
    的頭像 發(fā)表于 10-10 11:40 ?1657次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>啟動 Eureka流程

    Spring Boot的啟動原理

    可能很多初學者會比較困惑,Spring Boot 是如何做到將應用代碼和所有的依賴打包成一個獨立的 Jar 包,因為傳統(tǒng)的 Java 項目打包成 Jar 包之后,需要通過 -classpath 屬性
    的頭像 發(fā)表于 10-13 11:44 ?1459次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的啟動原理

    Spring Boot 的設計目標

    什么是Spring Boot Spring BootSpring 開源組織下的一個子項目,也是 S
    的頭像 發(fā)表于 10-13 14:56 ?1189次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的設計目標