Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
器之心發(fā)布
機(jī)器之心編輯部
聯(lián)合視頻專(zhuān)家組 JVET 官網(wǎng)顯示,字節(jié)跳動(dòng)設(shè)立在美國(guó)的研發(fā)團(tuán)隊(duì)于今年初發(fā)起了一項(xiàng)視頻壓縮技術(shù)提案,并命名為 DAM(Deep-filtering with Adaptive Model-selection)。相比 H.266/VVC 最新標(biāo)準(zhǔn),DAM 能夠?yàn)橐曨l編碼性能帶來(lái)顯著提升,亮度信號(hào) Y 可實(shí)現(xiàn) 10.28% 的性能增益。兩個(gè)色度信號(hào) U 和 V 的性能增益也分別達(dá)到 28.22% 和 27.97%。這是業(yè)界公開(kāi)的單個(gè)智能編碼工具的最佳性能增益。
視頻編解碼是視頻應(yīng)用的底層核心技術(shù),作用是對(duì)圖像進(jìn)行壓縮和數(shù)字編碼,以盡可能小的帶寬傳送盡可能高質(zhì)量的視頻數(shù)據(jù)。H.264 是現(xiàn)在被廣泛使用的視頻編解碼標(biāo)準(zhǔn),在同等視頻質(zhì)量下,H.265/HEVC 標(biāo)準(zhǔn)可以讓視頻體積減小一半。H.265 尚未完全普及,新一代標(biāo)準(zhǔn) H.266/VVC 比 H.265 讓視頻又減小一半。
這并不是視頻編碼技術(shù)的盡頭。
今年初,字節(jié)跳動(dòng)先進(jìn)視頻團(tuán)隊(duì)(AVG)向聯(lián)合視頻專(zhuān)家組 JVET 發(fā)起了一項(xiàng) JVET-U0068 技術(shù)提案,可以為視頻壓縮的三個(gè)顏色分量(Y, U, V)分別實(shí)現(xiàn)約 10%、28%、28% 的性能增益,這是業(yè)界公開(kāi)的單個(gè)智能編碼工具的最佳性能增益。在優(yōu)化壓縮質(zhì)量的同時(shí),視頻體積相比 H.266 最新標(biāo)準(zhǔn)至少還可以縮小 13%。就其實(shí)際效果而言,如果新技術(shù)得以應(yīng)用,與現(xiàn)在主流的 H.264 標(biāo)準(zhǔn)相比,我們看同樣質(zhì)量的視頻,大約只需要 22% 的帶寬和存儲(chǔ)空間。
這項(xiàng)技術(shù)名為 DAM(Deep-filtering with Adaptive Model-selection),它是通過(guò)深度學(xué)習(xí)技術(shù)構(gòu)建減少視頻壓縮失真的濾波器,主干是基于殘差單元堆疊的深度卷積神經(jīng)網(wǎng)絡(luò),輔以自適應(yīng)模型選擇以最大程度適應(yīng)特性復(fù)雜的自然視頻。該技術(shù)由字節(jié)跳動(dòng) AVG 的美國(guó)加州研發(fā)團(tuán)隊(duì)實(shí)現(xiàn),成員來(lái)自高通、英特爾、微軟等巨頭以及海內(nèi)外多家頂級(jí)院校。
我們先從下圖示例中對(duì)比 H.264 與 H.266+DAM 的視頻壓縮效果:
可以看到,相同壓縮比條件下,H.266+DAM 編碼壓縮質(zhì)量遠(yuǎn)遠(yuǎn)優(yōu)于 H.264。
除了視頻壓縮質(zhì)量提升之外,應(yīng)用 DAM 技術(shù)可以比H.266再縮小 13% 的數(shù)據(jù)體積,以下圖片來(lái)自國(guó)際標(biāo)準(zhǔn)組織的測(cè)試視頻。其中,圖(左)為原圖,每像素 12 字節(jié);圖(中)使用 VTM11.0 壓縮(qp=42),每像素 0.00216字節(jié),峰值信噪比 27.78dB;圖(右)使用 VTM11.0+DAM(qp=42),每像素 0.00184 字節(jié),峰值信噪比 28.02dB。
對(duì)比圖(中)和圖(右)可以看出,應(yīng)用 DAM 技術(shù)后,圖(右)壓縮比更高,峰值信噪比(客觀質(zhì)量)更好,主觀質(zhì)量也相對(duì)更好。
圖1. 左:原圖, 12bpp,中:VTM-11.0壓縮,QP42,0.00216bpp,27.78dB,右:VTM-11.0+DAM,QP42, 0.00184bpp,28.02dB
技術(shù)細(xì)節(jié)
DAM 的構(gòu)建方法
提案 JVET-U0068 所介紹的 DAM 是字節(jié)跳動(dòng) AVG 此前一項(xiàng)提案 JVET-T0088 的擴(kuò)展版本。
在具體實(shí)現(xiàn)上,為了減輕深度網(wǎng)絡(luò)的訓(xùn)練難度,DAM 算法利用殘差單元作為基本模塊,并多次堆疊來(lái)構(gòu)建最終網(wǎng)絡(luò)。所謂殘差單元是指通過(guò)引入跳層連接,允許網(wǎng)絡(luò)把注意力放在變化的殘差上。為了處理不同類(lèi)型的內(nèi)容,新技術(shù)針對(duì)不同類(lèi)型的 slice 和質(zhì)量級(jí)別訓(xùn)練不同網(wǎng)絡(luò)。此外,還引入了一些新特性來(lái)提高編碼性能。
圖 1:(a)是卷積神經(jīng)網(wǎng)絡(luò)濾波器的架構(gòu),M 代表特征圖的數(shù)量,N 代表特征圖的空間分辨率;(b)是(a)中殘差塊的結(jié)構(gòu)。
DAM 濾波方法的主干如上圖 1 所示,為了增加感受野,降低復(fù)雜度,此方法包含一個(gè)步幅為 2 的卷積層,該層將特征圖的空間分辨率在水平方向和垂直方向都降低到輸入大小的一半,這一層輸出的特征圖會(huì)經(jīng)過(guò)若干順序堆疊的殘差單元。最后一個(gè)卷積層以最后一個(gè)殘差單元的特征圖作為輸入,輸出 4 個(gè)子特征圖。最后,shuffle 層會(huì)生成空間分辨率與輸入相同的濾波圖像。
與此架構(gòu)相關(guān)的其他細(xì)節(jié)如下:
新特性:自適應(yīng)模型選擇
在 JVET-T0088 的卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)基礎(chǔ)上,JVET-U0068 引入了以下幾種新特性:
在線推斷及訓(xùn)練
推斷過(guò)程中使用 PyTorch 在 VTM 中執(zhí)行 DAM 深度學(xué)習(xí)的在線推斷,下表 1 是根據(jù) JVET 建議給出的網(wǎng)絡(luò)信息:
表 1。
訓(xùn)練過(guò)程中以 PyTorch 為訓(xùn)練平臺(tái),采用 DIV2K 和 BVI-DVC 數(shù)據(jù)集,分別訓(xùn)練針對(duì) intra slice 和 inter slice 的卷積神經(jīng)網(wǎng)絡(luò)濾波器,并且訓(xùn)練不同的模型以適應(yīng)不同的 QP 點(diǎn),訓(xùn)練階段的網(wǎng)絡(luò)信息根據(jù) JVET 建議列于下表 2 中。
注意,當(dāng)訓(xùn)練 inter slice 濾波器時(shí),預(yù)測(cè)信息也被用作輸入,而在 JVET-T0088 中,它僅用于 intra slice。
表 2。
下圖 2 給出了訓(xùn)練集和驗(yàn)證集損失函數(shù)的一個(gè)示例。
圖 2。
實(shí)驗(yàn)結(jié)果:三個(gè)顏色分量(亮度 Y 和色度 Cb、Cr)性能增益顯著
考慮到 VTM-9.0 和 VTM-10.0 之間的微小差異,并根據(jù) JVET 定義的常規(guī)測(cè)試條件,在 VTM-9.0 上測(cè)試了字節(jié)跳動(dòng) AVG 的 DAM 技術(shù)提案,測(cè)試結(jié)果如下表 3 和表 4 所示。
結(jié)果顯示,在 RA 構(gòu)型下,Y、Cb 和 Cr 的 BD-rate 節(jié)省分別為 10.28%、28.22% 和 27.97%;在 AI 配置下,對(duì) Y、Cb 和 Cr 分別可帶來(lái) 8.33%、23.11% 和 23.55% 的 BD-rate 節(jié)省。
表 3:AVG 提案在 VTM9.0(RA)上的性能表現(xiàn)。
表 4:AVG 提案在 VTM9.0(AI)上的性能表現(xiàn)。
總結(jié)
實(shí)測(cè)證明,字節(jié)跳動(dòng) AVG 的這項(xiàng)視頻編碼技術(shù)創(chuàng)新,可以讓視頻的數(shù)據(jù)體積相比 H.266 最新國(guó)際標(biāo)準(zhǔn)再縮小 13%。對(duì)視頻服務(wù)商來(lái)說(shuō),存儲(chǔ)和帶寬成本將顯著降低;對(duì)用戶來(lái)說(shuō),在網(wǎng)速較慢的情況下也可以流暢觀看高清視頻。
但正如前文所述,早在 2013年正式通過(guò)的 H.265,如今還沒(méi)有完全普及。一方面,高昂的專(zhuān)利授權(quán)費(fèi)用導(dǎo)致生產(chǎn)硬件設(shè)備和生產(chǎn)內(nèi)容的廠商無(wú)法承擔(dān),用戶也只能買(mǎi)并不支持 H.265 標(biāo)準(zhǔn)的設(shè)備;另一方面,H.265 的專(zhuān)利收費(fèi)很復(fù)雜,想要使用 H.265 得分別多次繳專(zhuān)利費(fèi)。因此,目前最常見(jiàn)的還是 18 年前的 H.264 標(biāo)準(zhǔn)。
盡管 H.266 新一代標(biāo)準(zhǔn)的推廣還有很長(zhǎng)的路要走,字節(jié)跳動(dòng) AVG 的技術(shù)探索并不會(huì)停止,其研究成果也會(huì)通過(guò)自主研發(fā)的 BVC 編碼器投入應(yīng)用,為抖音、西瓜視頻、等 App 的視頻類(lèi)內(nèi)容處理,以及云計(jì)算、云游戲等基礎(chǔ)架構(gòu)領(lǐng)域創(chuàng)造更高清畫(huà)質(zhì)、更流暢播放的視頻體驗(yàn)。
ue.js 的核心是一個(gè)響應(yīng)的數(shù)據(jù)綁定系統(tǒng),它允許我們?cè)谄胀?HTML 模板中使用特殊的語(yǔ)法將 DOM “綁定”到底層數(shù)據(jù)。被綁定的DOM 將與數(shù)據(jù)保持同步,每當(dāng)數(shù)據(jù)有改動(dòng),相應(yīng)的DOM視圖也會(huì)更新。基于這種特性,通過(guò)vue.js動(dòng)態(tài)綁定class就變得非常簡(jiǎn)單。
思路:以某一頁(yè)面樣式需要單獨(dú)適配iphonex為例
方式一.對(duì)象的形式(第一個(gè)參數(shù) 類(lèi)名, 第二個(gè)參數(shù):boolean值) :class="{'footer':isIphoneX}"
//某一頁(yè)面適配iPhone X <div class="bottom" :class="{'footer':isIphoneX}"> </div> data () { return { isIphoneX:false } }, mounted () { if(window.screen.width==375&&window.screen.height==812){ this.isIphoneX = true }
渲染后的
渲染后的HTML: <div class="bottom footer"> </div>
如圖:
image
優(yōu)點(diǎn):以對(duì)象的形式可以寫(xiě)多個(gè),用逗號(hào)分開(kāi) <div :class="{'p1' : false, 'p': true}"></div>
方式二.三元表達(dá)式(放在數(shù)組中,類(lèi)名要用引號(hào)) :class="[isIphoneX ? 'bottom' : 'footer']"
//某一頁(yè)面適配iPhone X <div :class="[isIphoneX ? 'bottom' : 'footer']"> </div>
渲染后:
渲染后的HTML: <div class="footer"> </div>
image.gif
如圖:
image
**方式三.動(dòng)態(tài)數(shù)組里的變量 **:class="[isTrue, isFalse]"
//某一頁(yè)面適配iPhone X <div :class="[{'footer':isIphoneX} , 'bottom']"> </div>
渲染后和方法一是一樣的。vue數(shù)據(jù)和class都符合雙向綁定的規(guī)則!
omcat是什么?
Tomcat是開(kāi)源的 Java Web 應(yīng)用服務(wù)器,實(shí)現(xiàn)了 Java EE 的部分技術(shù)規(guī)范,比如 Java Servlet、Java Server Page、JSTL、Java WebSocket。Java EE 是 Sun 公 司為企業(yè)級(jí)應(yīng)用推出的標(biāo)準(zhǔn)平臺(tái),定義了一系列用于企業(yè)級(jí)開(kāi)發(fā)的技術(shù)規(guī)范。除了上述的之外,還有 EJB、Java Mail、JPA、JTA、JMS 等,而這些都依賴(lài)具體容器的實(shí)現(xiàn)。
上圖對(duì)比了 Java EE 容器的實(shí)現(xiàn)情況,Tomcat 和 Jetty 都只提供了 Java Web 容器必需的 Servlet 和 JSP 規(guī)范,開(kāi)發(fā)者要想實(shí)現(xiàn)其他的功能,需要自己依賴(lài)其他開(kāi)源實(shí)現(xiàn)。
Glassfish 是由 sun 公司推出,Java EE 最新規(guī)范出來(lái)之后,首先會(huì)在 Glassfish 上進(jìn)行實(shí)現(xiàn),所以是研究 Java EE 最新技術(shù)的首選。
最常見(jiàn)的情況是使用 Tomcat 作為 Java Web 服務(wù)器,使用 Spring 提供的開(kāi)箱即用的強(qiáng)大功能,并依賴(lài)其他開(kāi)源庫(kù)來(lái)完成負(fù)責(zé)的業(yè)務(wù)功能實(shí)現(xiàn)。
Servlet容器
Tomcat 組成
如下圖所示,主要有 Container 和 Connector 以及相關(guān)組件構(gòu)成。
Container組成
生命周期管理
Tomcat 為了方便管理組件和容器的生命周期,定義了從創(chuàng)建、啟動(dòng)、到停止、銷(xiāo)毀共 12 種狀態(tài)
tomcat 生命周期管理了內(nèi)部狀態(tài)變化的規(guī)則控制,組件和容器只需實(shí)現(xiàn)相應(yīng)的生命周期方法,即可完成各生命周期內(nèi)的操作(initInternal、startInternal、stopInternal、 destroyInternal);
比如執(zhí)行初始化操作時(shí),會(huì)判斷當(dāng)前狀態(tài)是否 New,如果不是則拋出生命周期異常;是的話則設(shè)置當(dāng)前狀態(tài)為 Initializing,并執(zhí)行 initInternal 方法,由子類(lèi)實(shí)現(xiàn),方法執(zhí)行成功則設(shè)置當(dāng)前狀態(tài)為 Initialized,執(zhí)行失敗則設(shè)置為 Failed 狀態(tài);
Tomcat 的生命周期管理引入了事件機(jī)制,在組件或容器的生命周期狀態(tài)發(fā)生變化時(shí)會(huì)通知事件監(jiān)聽(tīng)器,監(jiān)聽(tīng)器通過(guò)判斷事件的類(lèi)型來(lái)進(jìn)行相應(yīng)的操作。事件監(jiān)聽(tīng)器的添加可以在 server.xml 文件中進(jìn)行配置;
Tomcat 各類(lèi)容器的配置過(guò)程是通過(guò)添加 listener 的方式來(lái)進(jìn)行的,從而達(dá)到配置邏輯與容器的解耦。如 EngineConfig、HostConfig、ContextConfig。
Tomcat 的啟動(dòng)過(guò)程
啟動(dòng)從 Tomcat 提供的 start.sh 腳本開(kāi)始,shell 腳本會(huì)調(diào)用 Bootstrap 的 main 方法,實(shí)際調(diào)用了 Catalina 相應(yīng)的 load、start 方法。
load 方法會(huì)通過(guò) Digester 進(jìn)行 config/server.xml 的解析,在解析的過(guò)程中會(huì)根據(jù) xml 中的關(guān)系 和配置信息來(lái)創(chuàng)建容器,并設(shè)置相關(guān)的屬性。
接著 Catalina 會(huì)調(diào)用 StandardServer 的 init 和 start 方法進(jìn)行容器的初始化和啟動(dòng)。
按照 xml 的配置關(guān)系,server 的子元素是 service,service 的子元素是頂層容器 Engine,每層容器都持有自己的子容器,而這些元素都實(shí)現(xiàn)了生命周期管理的各個(gè)方法,因此就很容易的完成整個(gè)容器的啟動(dòng)、關(guān)閉等生命周期的管理。
StandardServer 完成 init 和 start 方法調(diào)用后,會(huì)一直監(jiān)聽(tīng)來(lái)自 8005 端口(可配置)
如果接收 到 shutdown 命令,則會(huì)退出循環(huán)監(jiān)聽(tīng),執(zhí)行后續(xù)的 stop 和 destroy 方法,完成 Tomcat 容器的關(guān)閉。
同時(shí)也會(huì)調(diào)用 JVM 的 Runtime.getRuntime()?.addShutdownHook 方法,在虛擬機(jī)意外退出的時(shí)候來(lái)關(guān)閉容器。
所有容器都是繼承自 ContainerBase,基類(lèi)中封裝了容器中的重復(fù)工作,負(fù)責(zé)啟動(dòng)容器相關(guān)的組件 Loader、Logger、Manager、Cluster、Pipeline,啟動(dòng)子容器(線程池并發(fā)啟動(dòng)子容器,通過(guò)線程池 submit 多個(gè)線程,調(diào)用后返回 Future 對(duì)象,線程內(nèi)部啟動(dòng)子容器,接著調(diào)用 Future 對(duì)象 的 get 方法來(lái)等待執(zhí)行結(jié)果)。
List<future> results = new ArrayList<future>();
for (int i = 0; i < children.length; i++) {
results.add(startStopExecutor.submit(new StartChild(children[i])));
}
boolean fail = false;
for (Futureresult :results) {
try {
result.get();
} catch (Exception e) {
log.error(sm.getString("containerBase.threadedStartFailed"), e);
fail = true;
}
}
Web 應(yīng)用的部署方式
注:catalina.home:安裝目錄;catalina.base:工作目錄;默認(rèn)值 user.dir
HostConfig 監(jiān)聽(tīng)了 StandardHost 容器的事件,在 start 方法中解析上述配置文件:
注:
ContextConfig 解析 context.xml 順序:
ContextConfig 解析 web.xml 順序:
注:
Servlet 生命周期
Servlet 是用 Java 編寫(xiě)的服務(wù)器端程序,其主要功能在于交互式地瀏覽和修改數(shù)據(jù),生成動(dòng)態(tài) Web 內(nèi)容。
load on startup
當(dāng)值為 0 或者大于 0 時(shí),表示容器在應(yīng)用啟動(dòng)時(shí)就加載這個(gè) servlet; 當(dāng)是一個(gè)負(fù)數(shù)時(shí)或者沒(méi)有指定時(shí),則指示容器在該 servlet 被選擇時(shí)才加載; 正數(shù)的值越小,啟動(dòng)該 servlet 的優(yōu)先級(jí)越高;
single thread model
每次訪問(wèn) servlet,新建 servlet 實(shí)體對(duì)象,但并不能保證線程安全,同時(shí) tomcat 會(huì)限制 servlet 的實(shí)例數(shù)目
最佳實(shí)踐:不要使用該模型,servlet 中不要有全局變量
請(qǐng)求處理過(guò)程
Pipeline 與 Valve
Pipeline 可以理解為現(xiàn)實(shí)中的管道,Valve 為管道中的閥門(mén),Request 和 Response 對(duì)象在管道中 經(jīng)過(guò)各個(gè)閥門(mén)的處理和控制。
每個(gè)容器的管道中都有一個(gè)必不可少的 basic valve,其他的都是可選的,basic valve 在管道中最 后調(diào)用,同時(shí)負(fù)責(zé)調(diào)用子容器的第一個(gè) valve。
Valve 中主要的三個(gè)方法:setNext、getNext、invoke;valve 之間的關(guān)系是單向鏈?zhǔn)浇Y(jié)構(gòu),本身 invoke 方法中會(huì)調(diào)用下一個(gè) valve 的 invoke 方法。
各層容器對(duì)應(yīng)的 basic valve 分別是 StandardEngineValve、StandardHostValve、 StandardContextValve、StandardWrapperValve。
JSP引擎
JSP 生命周期
JSP元素
代碼片段:<%>
JSP聲明:<%! ...="">
JSP表達(dá)式:<%=>
JSP注釋?zhuān)?lt;%-->
JSP指令:<%@ directive="" attribute="“value”">
JSP行為:
HTML元素:html/head/body/div/p/…
JSP隱式對(duì)象:request、response、out、session、application、config、pageContext、page、Exception
JSP 元素說(shuō)明
Jsp 解析過(guò)程
Connector
Http:HTTP 是超文本傳輸協(xié)議,是客戶端瀏覽器或其他程序與 Web 服務(wù)器之間的應(yīng)用層通信協(xié) 議
AJP:Apache JServ 協(xié)議(AJP)是一種二進(jìn)制協(xié)議,專(zhuān)門(mén)代理從 Web 服務(wù)器到位于后端的應(yīng)用 程序服務(wù)器的入站請(qǐng)求
阻塞 IO
非阻塞 IO
IO多路復(fù)用
阻塞與非阻塞的區(qū)別在于進(jìn)行讀操作和寫(xiě)操作的系統(tǒng)調(diào)用時(shí),如果此時(shí)內(nèi)核態(tài)沒(méi)有數(shù)據(jù)可讀或者沒(méi)有緩沖空間可寫(xiě)時(shí),是否阻塞。
IO多路復(fù)用的好處在于可同時(shí)監(jiān)聽(tīng)多個(gè)socket的可讀和可寫(xiě)事件,這樣就能使得應(yīng)用可以同時(shí)監(jiān)聽(tīng)多個(gè)socket,釋放了應(yīng)用線程資源。
Tomcat各類(lèi)Connector對(duì)比
Connector的實(shí)現(xiàn)模式有三種,分別是BIO、NIO、APR,可以在server.xml中指定。
Apache Portable Runtime是一個(gè)高度可移植的庫(kù),它是Apache HTTP Server 2.x的核心。
APR具有許多用途,包括訪問(wèn)高級(jí)IO功能(如sendfile,epoll和OpenSSL),操作系統(tǒng)級(jí)功能(隨機(jī)數(shù)生成,系統(tǒng)狀態(tài)等)和本地進(jìn)程處理(共享內(nèi)存,NT管道和Unix套接字)
表格中字段含義說(shuō)明:
NIO處理相關(guān)類(lèi)
Acceptor線程負(fù)責(zé)接收連接,調(diào)用accept方法阻塞接收建立的連接,并對(duì)socket進(jìn)行封裝成PollerEvent,指定注冊(cè)的事件為op_read,并放入到EventQueue隊(duì)列中,PollerEvent的run方法邏輯的是將Selector注冊(cè)到socket的指定事件;
Poller線程從EventQueue獲取PollerEvent,并執(zhí)行PollerEvent的run方法,調(diào)用Selector的select方法,如果有可讀的Socket則創(chuàng)建Http11NioProcessor,放入到線程池中執(zhí)行
CoyoteAdapter是Connector到Container的適配器,Http11NioProcessor調(diào)用其提供的service方法,內(nèi)部創(chuàng)建Request和Response對(duì)象,并調(diào)用最頂層容器的Pipeline中的第一個(gè)Valve的invoke方法
Mapper主要處理http url 到servlet的映射規(guī)則的解析,對(duì)外提供map方法
NIO Connector主要參數(shù)
Comet
Comet是一種用于web的推送技術(shù),能使服務(wù)器實(shí)時(shí)地將更新的信息傳送到客戶端,而無(wú)須客戶端發(fā)出請(qǐng)求
在WebSocket出來(lái)之前,如果不適用comet,只能通過(guò)瀏覽器端輪詢(xún)Server來(lái)模擬實(shí)現(xiàn)服務(wù)器端推送。
Comet支持servlet異步處理IO,當(dāng)連接上數(shù)據(jù)可讀時(shí)觸發(fā)事件,并異步寫(xiě)數(shù)據(jù)(阻塞)
Tomcat要實(shí)現(xiàn)Comet,只需繼承HttpServlet同時(shí),實(shí)現(xiàn)CometProcessor接口
Note:
異步Servlet
傳統(tǒng)流程:
異步處理流程:
Servlet 線程將請(qǐng)求轉(zhuǎn)交給一個(gè)異步線程來(lái)執(zhí)行業(yè)務(wù)處理,線程本身返回至容器,此時(shí) Servlet 還沒(méi)有生成響應(yīng)數(shù)據(jù),異步線程處理完業(yè)務(wù)以后,可以直接生成響應(yīng)數(shù)據(jù)(異步線程擁有 ServletRequest 和 ServletResponse 對(duì)象的引用)
為什么web應(yīng)用中支持異步?
推出異步,主要是針對(duì)那些比較耗時(shí)的請(qǐng)求:比如一次緩慢的數(shù)據(jù)庫(kù)查詢(xún),一次外部REST API調(diào)用, 或者是其他一些I/O密集型操作。這種耗時(shí)的請(qǐng)求會(huì)很快的耗光Servlet容器的線程池,繼而影響可擴(kuò)展性。
Note:從客戶端的角度來(lái)看,request仍然像任何其他的HTTP的request-response交互一樣,只是耗費(fèi)了更長(zhǎng)的時(shí)間而已
異步事件監(jiān)聽(tīng)
Note :
onError/ onTimeout觸發(fā)后,會(huì)緊接著回調(diào)onComplete
onComplete 執(zhí)行后,就不可再操作request和response
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。