時(shí)間:2023-06-30 16:33:01 | 來源:網(wǎng)站運(yùn)營
時(shí)間:2023-06-30 16:33:01 來源:網(wǎng)站運(yùn)營
7.Tomcat之參數(shù)配置:<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="100" maxIdleTime="60000" maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5" className="org.apache.catalina.core.StandardThreadExecutor"/> name注:線程池名稱,用于 Connector中指定。namePrefix注:所創(chuàng)建的每個(gè)線程的名稱前綴,一個(gè)單獨(dú)的線程名稱為 namePrefix+threadNumber。maxThreads注:池中最大線程數(shù)。默認(rèn)值200minSpareThreads注:活躍線程數(shù),也就是核心池線程數(shù),這些線程不會(huì)被銷毀,會(huì)一直存在。默認(rèn)值10maxIdleTime注:線程空閑時(shí)間,超過該時(shí)間后,空閑線程會(huì)被銷毀,默認(rèn)值為6000(1分鐘),單位毫秒。當(dāng)核心線程數(shù)滿了之后,新來的任務(wù)會(huì)添加到阻塞隊(duì)列,當(dāng)隊(duì)列滿了之后才會(huì)創(chuàng)建非核心線程,因?yàn)樯鲜鲇玫淖枞?duì)列是無界隊(duì)列,所以不會(huì)創(chuàng)建非核心線程, 即該時(shí)間也沒用。maxQueueSize注:linkedQueue在被執(zhí)行前最大線程排隊(duì)數(shù)目,默認(rèn)為Int的最大值,也就是廣義的無限。除非特殊情況,這個(gè)值不需要更改,否則會(huì)有請(qǐng)求不會(huì)被處理的情況發(fā)生。默認(rèn):Integer.MAX_VALUEprestartminSpareThreads注:啟動(dòng)線程池時(shí)是否啟動(dòng) minSpareThreads部分線程。默認(rèn)值為false,即不啟動(dòng)。threadPriority注:線程池中線程優(yōu)先級(jí),默認(rèn)值為5,值從1到10。className注:線程池實(shí)現(xiàn)類,未指定情況下,默認(rèn)實(shí)現(xiàn)類為org.apache.catalina.core.StandardThreadExecutor。如果想使用自定義線程池首先需要實(shí)現(xiàn) org.apache.catalina.Executor接口。 ...線程池的設(shè)置要考慮任務(wù)類型IO型還是計(jì)算密集型,還要兼顧機(jī)器的性能。
連接器參數(shù)博客<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="10000" redirectPort="8443" maxConnections="2" maxThreads="2" acceptCount="2"/>port:端口protocol:協(xié)議connectionTimeout:是建立TCP連接后,等待第一次客戶端發(fā)送請(qǐng)求的超時(shí)時(shí)間,如果超過則會(huì)斷開連接。默認(rèn)值是60000mskeepAlivedTime:是客戶端發(fā)送完第一次請(qǐng)求后,到第二次的間隔超時(shí)時(shí)間時(shí)間。
重要參數(shù)<?xml version="1.0" encoding="UTF-8"?><!--關(guān)閉服務(wù)器的端口--><Server port="8005" shutdown="SHUTDOWN"> <!--日志形式輸出服務(wù)器,操作系統(tǒng),JVM的版本信息--> <Listener className="org.apache.catalina.startup.VersionLoggerListener"/> <!--用于加載(服務(wù)器啟動(dòng))和銷毀(服務(wù)器停止)APR,如果找不到APR庫,則會(huì)輸出日志不影響tomcat的啟動(dòng)--> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/> <!--用于避免JRE內(nèi)存泄露--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/> <!-- 全局命名服務(wù)--> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> <!-- 用于Context停止時(shí)重建Executor中的線程,避免ThreadLocal相關(guān)的內(nèi)存泄露 --> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/> <!-- 全局命名服務(wù)--> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml"/> </GlobalNamingResources> <Service name="Catalina"> <!-- 配置Connector共享線程池, <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="200" minSpareThreads="100" maxIdleTime="60000" 時(shí)間是毫秒,1分鐘 maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5" className="org.apache.catalina.core.StandardThreadExecutor"/> 如果沒有配置則各個(gè)connector用自己的線程池 --> <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" executor="tomcatThreadPool"/> <!--executor指定共享線程池的名字 --> <!-- AJP協(xié)議監(jiān)聽端口 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/> <!-- 默認(rèn)使用的虛擬主機(jī)名稱, 當(dāng)客戶端請(qǐng)求指向的主機(jī)無效時(shí), 將交由默認(rèn)的虛擬主機(jī)處理, 默認(rèn)主機(jī)名為localhost --> <Engine name="Catalina" defaultHost="localhost"> <!--For clustering, please take a look at documentation at: /docs/cluster-howto.html (simple how to) /docs/config/cluster.html (reference documentation) --> <!-- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <!-- Host 元素用于配置一個(gè)虛擬主機(jī), 它支持以下嵌入元素:Alias、Cluster、Listener、Valve、Realm、Context。 如果在Engine下配置Realm, 那么此配置將在當(dāng)前Engine下的所有Host中共享。 同樣,如果在Host中配置Realm , 則在當(dāng)前Host下的所有Context中共享。 Context中的Realm優(yōu)先級(jí) > Host 的Realm優(yōu)先級(jí) > Engine中的Realm優(yōu)先級(jí)。 --> <!-- 1) name: 當(dāng)前Host通用的網(wǎng)絡(luò)名稱, 必須與DNS服務(wù)器上的注冊(cè)信息一致。 Engine中包含的Host必須存在一個(gè)名稱與Engine的defaultHost設(shè)置一致。 2) appBase: 當(dāng)前Host的應(yīng)用基礎(chǔ)目錄, 當(dāng)前Host上部署的Web應(yīng)用均在該目錄下(可以是絕對(duì)目錄,相對(duì)路徑)。默認(rèn)為webapps。 3) unpackWARs: 設(shè)置為true, Host在啟動(dòng)時(shí)會(huì)將appBase目錄下war包解壓為目錄。設(shè)置為false, Host將直接從war文件啟動(dòng) 4) autoDeploy: 控制tomcat是否在運(yùn)行時(shí)定期檢測(cè)并自動(dòng)部署新增或變更的web應(yīng)用。(將改完的包放到tomcat里,不用重新啟動(dòng),tomcat會(huì)自動(dòng)重新部署) --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 1) docBase:Web應(yīng)用目錄或者War包的部署路徑。可以是絕對(duì)路徑,也可以是相對(duì)于 Host appBase的相對(duì)路徑。 2) path:Web應(yīng)用的Context 路徑。如果我們Host名為localhost, 則該web應(yīng)用訪問的根路徑為: http://localhost:8080/myApp。 --> <Context docBase="demon" path="/demon"> </Context> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b"/> </Host> </Engine> </Service></Server>
一個(gè)完整的Connector配置<Connector port="8080" protocol="HTTP/1.1" executor="tomcatThreadPool" maxThreads="1000" minSpareThreads="100" acceptCount="1000" maxConnections="20000" connectionTimeout="20000" compression="on" compressionMinSize="2048" disableUploadTimeout="true" redirectPort="8443" URIEncoding="UTF-8" />
<Host name="flank1" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b"/> </Host> <Host name="flank2" appBase="webapps2" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b"/> </Host>
<context-param> <param-name>database</param-name> <param-value>mysql</param-value> </context-param>public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { System.out.println("doGet....."); //獲取context-param參數(shù) String database = request.getServletContext().getInitParameter("database"); response.setContentType("text/html"); // Hello PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>" + message + "</h1>"); out.println("<h1>" + database + "</h1>"); out.println("</body></html>"); }
這些配置也可以在代碼里面寫。<!-- 配置Session--> <session-config> <!--session的失效時(shí)間默認(rèn)30分鐘--> <session-timeout>30</session-timeout> <cookie-config> <!--默認(rèn)的名字是JESSIONID也可以修改--> <name>JESSIONID-flank</name> <!--域名--> <domain>localhost</domain> <path>/</path> <!--注釋信息--> <comment>Session Cookie</comment> <!--表示這個(gè)Cookie只能通過瀏覽器發(fā)送http請(qǐng)求攜帶過來,不能通過JS發(fā)送--> <http-only>true</http-only> <!--如果為true則只有https的請(qǐng)求,才能攜帶session信息--> <secure>false</secure> <!--Cookie的有效時(shí)間,一個(gè)小時(shí)--> <max-age>3600</max-age> </cookie-config> <!--跟蹤模式,使用COOKIE進(jìn)行會(huì)話跟蹤,還有就是使用URL進(jìn)行跟蹤,就是將SESSION在URL上進(jìn)行賦值--> <tracking-mode>COOKIE</tracking-mode> </session-config>
驗(yàn)證 服務(wù)器端通過代碼public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { System.out.println("doGet....."); //獲取context-param參數(shù) String database = request.getServletContext().getInitParameter("database"); //獲取sessionID String id = request.getSession().getId(); System.out.println("id = " + id); response.setContentType("text/html"); // Hello PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>" + message + "</h1>"); out.println("<h1>" + database + "</h1>"); out.println("<h1>" + id + "</h1>"); out.println("</body></html>"); }
瀏覽器端 <servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>com.example.demo.HelloServlet</servlet-class> <!--設(shè)置servlet的初始化參數(shù),只對(duì)當(dāng)前servlet有效,區(qū)別context-param--> <init-param> <!--可以用HttpServlet的getInitParameter方法來獲取值--> <param-name>name</param-name> <param-value>tom</param-value> </init-param> <!-- 應(yīng)用程序啟動(dòng)的時(shí)候加載該Servlet,如果值<0則是當(dāng)?shù)谝淮卧L問時(shí)加載, 可以用servlet的init方法什么時(shí)候調(diào)用來體現(xiàn). --> <load-on-startup>1</load-on-startup> <!--true:表示當(dāng)前servlet可用可以接收請(qǐng)求--> <enabled>true</enabled> </servlet> <!--請(qǐng)求路徑和servlet的映射--> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <!-- 配置應(yīng)用的參數(shù)--> <context-param> <param-name>database</param-name> <param-value>mysql8.2</param-value> </context-param>
<filter> <filter-name>myFilter</filter-name> <filter-class>com.example.demo.LanguageFilter</filter-class> <init-param> <param-name>language</param-name> <param-value>CN</param-value> </init-param> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>public class LanguageFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //獲取filter的配置參數(shù) String language = filterConfig.getInitParameter("language"); System.out.println("filter-init: " + language); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("doFilter"); chain.doFilter(request, response); } @Override public void destroy() { System.out.println("destroy"); }}
如果是springboot項(xiàng)目就不用配置方式了,使用注冊(cè)MyFilterBean的方式來創(chuàng)建filter.和Intercepter的區(qū)別<!--歡迎頁面--> <welcome-file-list> <!--嘗試請(qǐng)求的順序,從上到下--> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 當(dāng)出現(xiàn)了異常時(shí)可以避免用戶看到. 用來配置訪問異常時(shí)定向到的頁面,支持HTTP響應(yīng)碼和異常類兩種形式--> <error-page> <error-code>404</error-code> <location>/404.html</location> </error-page> <error-page> <exception-type>java.lang.Exception</exception-type> <location>/505.html</location> <!--在servlet中使用i/0來造異常--> </error-page>
<!--添加一個(gè)連接器用來監(jiān)聽8443端口--><Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" schema="https" secure="true" SSLEnabled="true"> <SSLHostConfig certificateVerification="false"> <Certificate certificateKeystoreFile="tomcatkey.keystore" certificateKeystorePassword="tomcat" type="RSA" /> </SSLHostConfig> </Connector>
4.重啟tomcat測(cè)試 關(guān)鍵詞:配置,參數(shù)
客戶&案例
營銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。