تطبيق Java لتكنولوجيا BigPipe على Facebook.
يتم تنفيذ JPipe من خلال العلامات المخصصة ، لذلك ليس له أي تدخل في رمز الواجهة الخلفية.
HTML هي وظيفة تكمل الصفحة الأمامية ، في حين أن العلامات المخصصة يمكنها إكمال عمليات معينة في الخلفية.
ينطبق بشكل أساسي على:
| يكتب | عدد الطلبات | ضغط من جانب الخادم | تجربة المستخدم | سرعة تحميل صفحة الويب | ترتيب تحميل الوحدة النمطية | صعوبة في تحقيقها | صعوبة في ما بعد الصيانة |
|---|---|---|---|---|---|---|---|
| عادي | 1 | صغير | اختلاف | بطيئة | ترتيب تدفق المستندات | بسيط | عمومًا |
| أياكس | كثير | كبير | جيد | سريع | غير مؤكد | صعوبة | صعوبة |
| bigpipe المفردة | 1 | صغير | جيد | بطيئة | تخصيص | عمومًا | عمومًا |
| multithedbrided bigpipe | 1 | عام (ناتج عن تجمع الخيوط) | جيد | أسرع | غير مؤكد | الأكثر صعوبة | عمومًا |
| ملكية | يكتب | هل هو مطلوب | القيمة الافتراضية | يوضح | يصف |
|---|---|---|---|---|---|
| الحجم الأساسي | int | لا | -1 | عدد المواضيع الأساسية | الحد الأدنى لعدد مؤشرات الترابط الخاملة ، والحد الأدنى لعدد المواضيع التي ستستمر على أي حال |
| الحد الأقصى الحجم | int | لا | 1024 | الحد الأقصى لعدد المواضيع | يمكن لـ JPipe إنشاء الحد الأقصى لعدد المواضيع المستخدمة لمعالجة الحلقات |
| حجم قائمة الانتظار | int | لا | 1024 | الحد الأقصى لعدد العمود المشترك في الانتظار | طلب التزامن أكبر من أقصى حجم ، وسيتم وضعه في قائمة الانتظار والانتظار. |
| الحفاظ على الحفل | طويل | لا | 60000 | الحد الأقصى لوقت الخمول (MS) | إذا كان عدد المواضيع يتجاوز الحجم الأساسي ، فسيتم إعادة تدويره حتى يساوي عدد الخيوط بالحجم الأساسي. |
| ما قبل البدء | منطقية | لا | خطأ شنيع | حمام المسبق لتسخين الموضوع | ما إذا كان لبدء الخيوط الأساسية بحجمها |
| ملكية | يكتب | هل هو مطلوب | القيمة الافتراضية | يوضح | يصف |
|---|---|---|---|---|---|
| غير متزامن | منطقية | لا | حقيقي | سواء كنت تنفذ مهام باجيليت بشكل غير متزامن |
| ملكية | يكتب | هل هو مطلوب | القيمة الافتراضية | يوضح | يصف |
|---|---|---|---|---|---|
| دوميد | خيط | نعم | معرف المستند HTML | ||
| الفول | خيط | نعم | فول الربيع | ||
| var | خيط | نعم | المعلمات المتغيرة | ||
| أوري | خيط | لا | معلمات 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 : 10000 استخدم @Service spring's spring لتحديد باجلي لتنفيذ طريقة doExec لواجهة pageletbean
@ 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> حتى لا يتم عرض عرض الشاشة الأولى DOM. < %@ 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 ، يجب تقديم حاويات Servlet التي تدعم JSP 1.1 أو JSP 1.2 (عمليات نشر حاويات Servlet مثل Tomcat و Jetty) ، ويمكن استخدام FTL في بيئات الويب غير الخاضعة للخدمة وغيرها.
التفسير الأكثر دقة هو: على الرغم من أن حاوية Servlet لا تحتوي على دعم JSP المحلي ، يمكنك أيضًا استخدام مكتبة Tag JSP في جهاز Freemarker. فقط تأكد من أن javax.servlet.jsp.* حزمة JSP الإصدار 1.2 (أو الأحدث) متوفرة في تطبيق الويب. إذا كانت حاوية Servlet الخاصة بك تدعم JSP 1.1 فقط ، فيجب عليك نسخ الفئات الستة التالية (مثل يمكنك استخراج من حزمة JAR من Tomcat 5.x أو Tomcat 4.x) إلى Web-Inf/Classes/... دليل الويب: javax.servlet.jsp.tagext.iterationtagtage ، javax.servlet.jsp.tagext Javax.Servlet.ServletContextRistener ، javax.servlet.servletcontextTributelistener ، javax.servlet.http.httpessessionattributelistener ، javax.servlet.http.httpsessionlistener. ومع ذلك ، كن على دراية أنه نظرًا لأن الحاوية تدعم فقط JSP 1.1 ، عادةً ما تستخدم الإصدارات السابقة قبل Servlet 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 >نظرًا لأن الحاويات مثل Instrtow لا تحتوي على بيئة JSP-API ، فإنها بحاجة إلى الاعتماد على حزمة javax.servlet.jsp-api ، وفي الوقت نفسه ، يحتاجون إلى تكوين classpathtls من freemarker من خلال taglibfactory. بدون هذا التكوين ، سيتم الإبلاغ عن خطأ: freemarker.ext.jsp.taglibfactory $ taglibgettingexception: لم يتم العثور على TLD لـ "http://java.yl-online.top/jsp/jpipe" jsp taglib uri. (يتم البحث في TLD-S وفقًا لمواصفات JSP 2.2. في إعدادات التطوير والمدمجة ، قد تحتاج أيضًا إلى "metainftldsources" و "classpathtlds" freemarker.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 部署 -->نظرًا لوجود بالفعل بيئة JSP-API في Tomcat و Jetty ، فليس هناك حاجة للاعتماد على حزمة javax.servlet.jsp-api هنا بعد الآن