FacebookのBigPipeテクノロジーのJava実装。
JPipeはカスタムタグを介して実装されるため、バックエンドコードへの侵入がゼロになります。
HTMLは、前景ページを完成させる関数ですが、カスタムタグはバックグラウンドで特定の操作を完了できます。
主に適用可能:
| タイプ | リクエスト数 | サーバー側の圧力 | ユーザーエクスペリエンス | Webページの読み込み速度 | モジュールの読み込み順序 | 達成するのが難しい | メンテナンス後の難しさ |
|---|---|---|---|---|---|---|---|
| 普通 | 1 | 小さい | 違い | 遅い | ドキュメントフロー順序 | 単純 | 一般的に |
| ajax | 多くの | 大きい | 良い | 素早い | 不確実です | 困難 | 困難 |
| シングルスレッドビッグパイプ | 1 | 小さい | 良い | 遅い | カスタマイズ | 一般的に | 一般的に |
| マルチスレッドビッグパイプ | 1 | 一般(スレッドプールによって引き起こされる) | 良い | 最速 | 不確実です | 最も難しい | 一般的に |
| 財産 | タイプ | 必要ですか | デフォルト値 | 説明します | 説明する |
|---|---|---|---|---|---|
| コアサイズ | int | いいえ | -1 | コアスレッドの数 | アイドルスレッドの最小数、とにかく生き残る最小スレッド数 |
| マックスサイズ | int | いいえ | 1024 | スレッドの最大数 | jPipeは、ページセットを処理するために使用されるスレッドの最大数を作成できます |
| キューサイズ | int | いいえ | 1024 | 最大待機コラムカウント | リクエストの並行性は最大サイズよりも大きく、キューに入れて待ちます。 |
| キープアリブ | 長さ | いいえ | 60000 | 最大アイドル時間(MS) | スレッドの数がコアサイズを超えると、スレッドの数がコアサイズに等しくなるまでリサイクルされます。 |
| プレスタートオールコアスレッド | ブール | いいえ | 間違い | 予熱するスレッドプール | コアサイズのスレッドを事前に開始するかどうか |
| 財産 | タイプ | 必要ですか | デフォルト値 | 説明します | 説明する |
|---|---|---|---|---|---|
| async | ブール | いいえ | 真実 | ページェレットタスクを非同期に実行するかどうか |
| 財産 | タイプ | 必要ですか | デフォルト値 | 説明します | 説明する |
|---|---|---|---|---|---|
| ドミッド | 弦 | はい | HTMLドキュメントID | ||
| 豆 | 弦 | はい | 春の豆の名前 | ||
| var | 弦 | はい | 変数パラメーター | ||
| uri | 弦 | いいえ | URIパラメーター | ||
| jsmethod | 弦 | いいえ | jp.view | データをラップするJS関数 |
JpipeThreadPoolFactoryBeanクラスを通じて<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< beans xmlns = " http://www.springframework.org/schema/beans "
xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance "
xsi : schemaLocation = " http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd " >
< bean class = " top.ylonline.jpipe.spring.JpipeSpringFactoryBean " />
< bean id = " pool-1 " class = " top.ylonline.jpipe.threadpool.common.Pool " >
< property name = " coreSize " value = " -1 " />
< property name = " maxSize " value = " 20 " />
< property name = " preStartAllCoreThreads " value = " false " />
< property name = " keepAlive " value = " 12000000 " />
< property name = " queueSize " value = " 500 " />
</ bean >
<!-- 工场模式 -->
< bean class = " top.ylonline.jpipe.threadpool.util.JpipeThreadPoolFactoryBean " >
< property name = " pool " ref = " pool-1 " />
</ bean >
<!-- 或者
<bean class="top.ylonline.jpipe.threadpool.util.JpipeThreadPoolFactoryBean">
<property name="pool">
<bean class="top.ylonline.jpipe.threadpool.common.Pool">
<property name="coreSize" value="4"/>
<property name="maxSize" value="10"/>
<property name="preStartAllCoreThreads" value="true"/>
<property name="keepAlive" value="60000"/>
<property name="queueSize" value="500"/>
</bean>
</property>
</bean>
-->
</ beans >JpipeThreadPoolBuilderクラスを通じて<? xml version = " 1.0 " encoding = " UTF-8 " ?>
< beans xmlns = " http://www.springframework.org/schema/beans "
xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance "
xsi : schemaLocation = " http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd " >
< bean class = " top.ylonline.jpipe.spring.JpipeSpringFactoryBean " />
<!-- builder 模式 -->
< bean id = " jpipeThreadPoolBuilder " class = " top.ylonline.jpipe.threadpool.util.JpipeThreadPoolBuilder " >
< property name = " pool " >
< bean class = " top.ylonline.jpipe.threadpool.common.Pool " >
< property name = " coreSize " value = " 1 " />
< property name = " maxSize " value = " 1 " />
< property name = " preStartAllCoreThreads " value = " true " />
< property name = " keepAlive " value = " 1 " />
< property name = " queueSize " value = " 1 " />
</ bean >
</ property >
</ bean >
< bean id = " jpipeThreadPool-3 " factory-bean = " jpipeThreadPoolBuilder " factory-method = " build " />
</ beans > @ Bean
public JpipeSpringFactoryBean jpipeSpringFactoryBean (){
return new JpipeSpringFactoryBean ();
}
@ Bean
public JpipeThreadPoolExecutor jpipeThreadPoolExecutor () {
Pool pool = new Pool ();
pool . setCoreSize ( 10 );
pool . setMaxSize ( 1024 );
pool . setPreStartAllCoreThreads ( true );
pool . getKeepAlive ( 60000 );
pool . getQueueSize ( 512 );
// return new EagerThreadPool().getExecutor(pool);
return new JpipeThreadPoolBuilder ( pool ). build ();
}スプリングブートスターター経由
< dependency >
< groupId >top.ylonline.jpipe</ groupId >
< artifactId >jpipe-spring-boot-starter</ artifactId >
< version >${version}</ version >
</ dependency > jpipe :
# enabled: true
pool :
pre-start-all-core-threads : true
core-size : -1
max-size : 20
queue-size : 10
keep-alive : 10000Springの@Serviceを使用して、PageletbeanインターフェイスのDOEXECメソッドを実装するためにパゲレットを定義します
@ Service ( "testPagelet1" )
public class PageletServiceTest implements PageletBean {
@ Override
public Map < String , Object > doExec ( final Map < String , String > params ) {
Map < String , Object > data = new HashMap <>( params );
try {
TimeUnit . MILLISECONDS . sleep ( new Random (). nextInt ( 5000 ));
} catch ( InterruptedException e ) {
e . printStackTrace ();
}
return data ;
}
}jpipe.core.js
; ( function ( root , factory ) {
if ( typeof exports === 'object' ) {
module . exports = exports = factory ( ) ;
} else if ( typeof define === 'function' && define . amd ) {
define ( [ ] , factory ) ;
} else {
root . JP = factory ( ) ;
}
} ( this , function ( ) {
var JP = JP || ( function ( window ) {
return {
view : function ( json ) {
var id = json [ 'id' ] ;
document . getElementById ( id ) . innerHTML = json [ 'html' ] ;
}
} ;
} ( window ) ) ;
return JP ;
} ) ) ;<%@ taglib prefix="jp" uri="http://java.yl-online.top/jsp/jpipe" %>を紹介します</body>に置くのが最善です。 < %@ page contentType="text/html;charset=UTF-8" trimDirectiveWhitespaces="true" % >
< %@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" % >
< %@ taglib prefix="jp" uri="http://java.yl-online.top/jsp/jpipe" % >
< c:set var =" ctx " value =" ${pageContext.request.contextPath} " />
< html lang =" en " >
< head >
< title > index </ title >
< meta http-equiv =" Content-Type " content =" text/html; charset=UTF-8 " />
< meta name =" viewport " content =" width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no " >
< script type =" text/javascript " src =" ${ctx}/resources/jpipe.core.js " > </ script >
</ head >
< body >
< h1 > index </ h1 >
< div id =" pagelet1 " > </ div >
< div id =" pagelet2 " > </ div >
< jp:pipe >
< jp:pagelet domid =" pagelet1 " bean =" testPagelet1 " var =" item " uri =" id=123&name=forever杨" >
< h1 > jspbody support </ h1 >
< p > ${item.id} </ p >
</ jp:pagelet >
< jp:pagelet domid =" pagelet2 " bean =" testPagelet2 " var =" item2 " uri =" id=456&name=forever杨2 " >
< h1 > jspbody support </ h1 >
< p > ${item2.name} </ p >
</ jp:pagelet >
</ jp:pipe >
</ body >
</ html >いいえ:TomcatやJettyなどのコンテナに展開します
@ Configuration
public class MvcWevConfig {
@ Resource
private freemarker . template . Configuration configuration ;
@ PostConstruct
public void setConfiguration () {
Version version = freemarker . template . Configuration . getVersion ();
DefaultObjectWrapper wrapper = new DefaultObjectWrapperBuilder ( version ). build ();
this . configuration . setSharedVariable ( "jp" , new FmHashModel ( wrapper ));
}
} < #-- < #assign pipe="top.ylonline.jpipe.freemarker.tag.PipeTag"?new() /> -- >
< #-- < #assign pagelet="top.ylonline.jpipe.freemarker.tag.PageletTag"?new() /> -- >
< html lang =" en " >
< head >
< title > index </ title >
< meta http-equiv =" Content-Type " content =" text/html; charset=UTF-8 " />
< meta name =" viewport " content =" width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no " >
< script type =" text/javascript " src =" jpipe.core.js " > </ script >
</ head >
< body >
< h1 > index </ h1 >
< div id =" pagelet1 " > </ div >
< div id =" pagelet2 " > </ div >
< @jp.pipe >
< @jp.pagelet domid="pagelet1" bean="testPagelet1" var="item" uri="id=123&name=forever杨" >
< h1 > testPagelet1 jspbody support </ h1 >
< p > ${item.id} </ p >
</ @jp.pagelet >
< @jp.pagelet domid="pagelet2" bean="testPagelet2" var="item2" uri="id=456&name=forever杨2" >
< h1 > testPagelet2 jspbody support </ h1 >
< p > ${item2.name} </ p >
</ @jp.pagelet >
</ @jp.pipe >
</ body >
</ html > < #assign pipe="top.ylonline.jpipe.freemarker.tag.PipeTag"?new() />
< #assign pagelet="top.ylonline.jpipe.freemarker.tag.PageletTag"?new() />
< html lang =" en " >
< head >
< title > index </ title >
< meta http-equiv =" Content-Type " content =" text/html; charset=UTF-8 " />
< meta name =" viewport " content =" width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no " >
< script type =" text/javascript " src =" jpipe.core.js " > </ script >
</ head >
< body >
< h1 > index </ h1 >
< div id =" pagelet1 " > </ div >
< div id =" pagelet2 " > </ div >
< @jp.pipe >
< @jp.pagelet domid="pagelet1" bean="testPagelet1" var="item" uri="id=123&name=forever杨" >
< h1 > testPagelet1 jspbody support </ h1 >
< p > ${item.id} </ p >
</ @jp.pagelet >
< @jp.pagelet domid="pagelet2" bean="testPagelet2" var="item2" uri="id=456&name=forever杨2" >
< h1 > testPagelet2 jspbody support </ h1 >
< p > ${item2.name} </ p >
</ @jp.pagelet >
</ @jp.pipe >
</ body >
</ html >FTLはJSPタグの使用をサポートしています。プロジェクトがJSPテンプレートを使用していない場合、これは推奨されません。カスタムJSPタグはJSP環境で作成および操作されるため、JSP 1.1またはJSP 1.2をサポートするサーブレットコンテナを導入する必要があります(TomcatやJettyなどのサーブレットコンテナの展開)。
より正確な説明は、サーブレットコンテナにはローカルJSPサポートがありませんが、FreeMarkerのJSPタグライブラリを使用することもできます。 javax.servlet.jsp。* JSPバージョン1.2(または新しい)のパッケージがWebアプリケーションで利用できることを確認してください。サーブレットコンテナがJSP 1.1のみをサポートしている場合、次の6つのクラス(Tomcat 5.xまたはTomcat 4.xのJARパッケージから抽出できるなど)をコピーする必要があります。 javax.servlet.servletcontextlistener、javax.servlet.servletcontextattributelistener、javax.servlet.http.httpssionttributeListener、javax.servlet.http.httpsessionlistener。ただし、コンテナはJSP 1.1のみをサポートしているため、通常はサーブレット2.3の前に以前のバージョンを使用しているため、イベントリスナーがサポートされない可能性があるため、イベントリスナーを登録するJSP 1.2タグライブラリは正常に動作します。
報道時間の時点で:JSPはバージョン2.3にリリースされました
<#assign jp=JspTaglibs["http://java.yl-online.top/jsp/jpipe"] />を使用して、カスタムJSPタグを紹介します
< #assign jp=JspTaglibs["http://java.yl-online.top/jsp/jpipe"] />
< html lang =" en " >
< head >
< title > index </ title >
< meta http-equiv =" Content-Type " content =" text/html; charset=UTF-8 " />
< meta name =" viewport " content =" width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no " >
< script type =" text/javascript " src =" jpipe.core.js " > </ script >
</ head >
< body >
< h1 > index </ h1 >
< div id =" pagelet1 " > </ div >
< div id =" pagelet2 " > </ div >
< @jp.pipe >
< @jp.pagelet domid="pagelet1" bean="testPagelet1" var="item" uri="id=123&name=forever杨" >
< h1 > testPagelet1 support </ h1 >
< p > ${item.id} </ p >
</ @jp.pagelet >
< @jp.pagelet domid="pagelet2" bean="testPagelet2" var="item2" uri="id=456&name=forever杨2" >
< h1 > testPagelet2 support </ h1 >
< p > ${item2.name} </ p >
</ @jp.pagelet >
</ @jp.pipe >
</ body >
</ html > メイブン依存関係
<!-- undertow 部署 -->
< dependency >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-starter-undertow</ artifactId >
</ dependency >
<!-- undertow 部署 -->
< dependency >
< groupId >javax.servlet.jsp</ groupId >
< artifactId >javax.servlet.jsp-api</ artifactId >
< version >2.3.3</ version >
</ dependency >UnderTowなどのコンテナにはJSP-API環境がないため、javax.servlet.jsp-apiパッケージに依存する必要があり、同時に、TaglibFactoryを通じてFreeMarkerのClassPathtldsを構成する必要があります。この構成がなければ、エラーが報告されます:freemarker.ext.jsp.taglibfactory $ taglibgettingexception:「http://java.yl-online.top/jsp/jpipe "JSP taglib uriのtldは見つかりませんでした。 (TLD-SはJSP 2.2仕様に従って検索されます。開発および埋め込み型と埋め込み型コンテナの設定では、「メトインフルドソース」および「classpather.ext.servlet.freemarkerservlet init-paramsまたは同様のシステムプロパティが必要になる場合があります。)
構成
@ Configuration
public class MvcWevConfig {
@ Resource
private FreeMarkerConfigurer freeMarkerConfigurer ;
@ PostConstruct
public void loadClassPathTlds () {
List < String > classpathTlds = new ArrayList <>();
classpathTlds . add ( "/META-INF/Jpipe.tld" );
freeMarkerConfigurer . getTaglibFactory (). setClasspathTlds ( classpathTlds );
}
}メイブン依存関係
<!-- 外部 Tomcat 部署 -->
< dependency >
< groupId >javax.servlet</ groupId >
< artifactId >javax.servlet-api</ artifactId >
< scope >provided</ scope >
</ dependency >
< dependency >
< groupId >org.springframework.boot</ groupId >
< artifactId >spring-boot-starter-tomcat</ artifactId >
< scope >provided</ scope >
</ dependency >
< dependency >
< groupId >org.apache.tomcat.embed</ groupId >
< artifactId >tomcat-embed-jasper</ artifactId >
< scope >provided</ scope >
</ dependency >
<!-- 外部 Tomcat 部署 -->TomcatとJettyにはすでにJSP-API環境があるため、Javax.servlet.jsp-APIパッケージに頼る必要はもうありません。