Jetty Session Persistence By Redis
Copy jar 到$JETTY_HOME/lib/ext目录下
-rw-rw-r--. 1 conversant conversant 100193 Sep 11 17:34 commons-pool-1.5.5.jar
-rw-rw-r--. 1 conversant conversant 228268 Sep 11 17:34 jackson-core-asl-1.9.3.jar
-rw-rw-r--. 1 conversant conversant 773019 Sep 11 17:34 jackson-mapper-asl-1.9.3.jar
-rw-r--r--. 1 conversant conversant 125841 Sep 11 17:34 jedis-2.0.0.jar
-rw-rw-r--. 1 conversant conversant 1991094 Sep 11 17:34 jetty-session-redis-2.4.ga-SNAPSHOT-all.jar
-rw-r--r--. 1 conversant conversant 93525 Sep 11 17:34 logback-access-1.1.2.jar
-rw-r--r--. 1 conversant conversant 270747 Sep 11 17:34 logback-classic-1.1.2.jar
-rw-r--r--. 1 conversant conversant 427729 Sep 11 17:34 logback-core-1.1.2.jar
-rw-rw-r--. 1 conversant conversant 361155 Sep 11 17:34 trove-1.0.2.jar
-rw-rw-r--. 1 conversant conversant 24956 Sep 11 17:34 xpp3_min-1.1.4c.jar
-rw-rw-r--. 1 conversant conversant 431406 Sep 11 17:34 xstream-1.3.1.jar
准备jetty-cluster.xml
<?xml version="1.0"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"> <!-- =============================================================== --> <!-- Documentation of this file format can be found at: --> <!-- http://wiki.eclipse.org/Jetty/Reference/jetty.xml_syntax --> <!-- --> <!-- Additional configuration files are available in $JETTY_HOME/etc --> <!-- and can be mixed in. See start.ini file for the default --> <!-- configuration files. --> <!-- --> <!-- For a description of the configuration mechanism, see the --> <!-- output of: --> <!-- java -jar start.jar -? --> <!-- =============================================================== --> <!-- =============================================================== --> <!-- Configure a Jetty Server instance with an ID "Server" --> <!-- Other configuration files may also configure the "Server" --> <!-- ID, in which case they are adding configuration to the same --> <!-- instance. If other configuration have a different ID, they --> <!-- will create and configure another instance of Jetty. --> <!-- Consult the javadoc of o.e.j.server.Server for all --> <!-- configuration that may be set here. --> <!-- =============================================================== --> <Configure id="Server" class="org.eclipse.jetty.server.Server"> <!-- =========================================================== --> <!-- Configure the Server Thread Pool. --> <!-- The server holds a common thread pool which is used by --> <!-- default as the executor used by all connectors and servlet --> <!-- dispatches. --> <!-- --> <!-- Configuring a fixed thread pool is vital to controlling the --> <!-- maximal memory footprint of the server and is a key tuning --> <!-- parameter for tuning. In an application that rarely blocks --> <!-- then maximal threads may be close to the number of 5*CPUs. --> <!-- In an application that frequently blocks, then maximal --> <!-- threads should be set as high as possible given the memory --> <!-- available. --> <!-- --> <!-- Consult the javadoc of o.e.j.util.thread.QueuedThreadPool --> <!-- for all configuration that may be set here. --> <!-- =========================================================== --> <Arg name="threadpool"> <New id="threadpool" class="org.eclipse.jetty.util.thread.QueuedThreadPool"> <Arg name="minThreads" type="int"><Property name="threads.min" default="10"/></Arg> <Arg name="maxThreads" type="int"><Property name="threads.max" default="200"/></Arg> <Arg name="idleTimeout" type="int"><Property name="threads.timeout" default="60000"/></Arg> <Set name="detailedDump">false</Set> </New> </Arg> <!-- =========================================================== --> <!-- Add shared Scheduler instance --> <!-- =========================================================== --> <Call name="addBean"> <Arg> <New class="org.eclipse.jetty.util.thread.ScheduledExecutorScheduler"/> </Arg> </Call> <!-- =========================================================== --> <!-- Http Configuration. --> <!-- This is a common configuration instance used by all --> <!-- connectors that can carry HTTP semantics (HTTP, HTTPS, SPDY)--> <!-- It configures the non wire protocol aspects of the HTTP --> <!-- semantic. --> <!-- --> <!-- This configuration is only defined here and is used by --> <!-- reference from the jetty-http.xml, jetty-https.xml and --> <!-- jetty-spdy.xml configuration files which instantiate the --> <!-- connectors. --> <!-- --> <!-- Consult the javadoc of o.e.j.server.HttpConfiguration --> <!-- for all configuration that may be set here. --> <!-- =========================================================== --> <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration"> <Set name="secureScheme">https</Set> <Set name="securePort"><Property name="jetty.https.port" default="8443" /></Set> <Set name="outputBufferSize">32768</Set> <Set name="requestHeaderSize">8192</Set> <Set name="responseHeaderSize">8192</Set> <Set name="sendServerVersion">true</Set> <Set name="sendDateHeader">false</Set> <Set name="headerCacheSize">512</Set> <!-- Uncomment to enable handling of X-Forwarded- style headers <Call name="addCustomizer"> <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg> </Call> --> </New> <Call name="addConnector"> <Arg> <New class="org.eclipse.jetty.server.ServerConnector"> <Arg name="server"><Ref refid="Server" /></Arg> <Arg name="factories"> <Array type="org.eclipse.jetty.server.ConnectionFactory"> <Item> <New class="org.eclipse.jetty.server.HttpConnectionFactory"> <Arg name="config"><Ref refid="httpConfig" /></Arg> </New> </Item> </Array> </Arg> <Set name="host"><Property name="jetty.host" /></Set> <Set name="port"><Property name="jetty.port" default="8080" /></Set> <Set name="idleTimeout"><Property name="http.timeout" default="30000"/></Set> </New> </Arg> </Call> <Call id="httpsConnector" name="addConnector"> <Arg> <New class="org.eclipse.jetty.server.ServerConnector"> <Arg name="server"><Ref refid="Server" /></Arg> <Arg name="factories"> <Array type="org.eclipse.jetty.server.ConnectionFactory"> <Item> <New class="org.eclipse.jetty.server.SslConnectionFactory"> <Arg name="next">http/1.1</Arg> <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg> </New> </Item> <Item> <New class="org.eclipse.jetty.server.HttpConnectionFactory"> <Arg name="config"><Ref refid="sslHttpConfig"/></Arg> </New> </Item> </Array> </Arg> <Set name="host"><Property name="jetty.host" /></Set> <Set name="port"><Property name="jetty.https.port" default="8443" /></Set> <Set name="idleTimeout">30000</Set> </New> </Arg> </Call> <!-- =========================================================== --> <!-- Set the default handler structure for the Server --> <!-- A handler collection is used to pass received requests to --> <!-- both the ContextHandlerCollection, which selects the next --> <!-- handler by context path and virtual host, and the --> <!-- DefaultHandler, which handles any requests not handled by --> <!-- the context handlers. --> <!-- Other handlers may be added to the "Handlers" collection, --> <!-- for example the jetty-requestlog.xml file adds the --> <!-- RequestLogHandler after the default handler --> <!-- =========================================================== --> <Set name="handler"> <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection"> <Set name="handlers"> <Array type="org.eclipse.jetty.server.Handler"> <!-- <Item> <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/> </Item> <Item> <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/> </Item> --> <Item> <New class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/</Set> <Set name="war"><SystemProperty name="project.home" default="."/>/webapps</Set> <Set name="defaultsDescriptor"><SystemProperty name="project.home" default="."/>/conf/jetty/webdefault.xml</Set> <Set name="extractWAR">true</Set> <Set name="copyWebDir">false</Set> <Call name="addServlet"> <Arg>org.eclipse.jetty.servlet.DefaultServlet</Arg> <Arg>/</Arg> </Call> <Set name="sessionHandler"> <New class="org.eclipse.jetty.server.session.SessionHandler"> <Arg> <New class="com.ovea.jetty.session.redis.RedisSessionManager"> <Arg>session/redis</Arg> <Arg> <New class="com.ovea.jetty.session.serializer.JsonSerializer"/> </Arg> <!-- set the interval in seconds to force session persistence event if it didn't changed. Default to 60 seconds --> <Set name="saveInterval">20</Set> <!-- set the cookie domain --> <Set name="sessionDomain">ssdev.swiftsync.com.sg</Set> <!-- set the cookie path --> <Set name="sessionPath">/</Set> <!-- set the cookie max age in seconds. Default is -1 (no max age). 1 day = 86400 seconds --> <Set name="maxCookieAge">86400</Set> <!-- set the interval in seconds to refresh the cookie max age. Default to 0. This number should be lower than the session expirity time. --> <Set name="refreshCookieAge">300</Set> </New> </Arg> </New> </Set> </New> </Item> </Array> </Set> </New> </Set> <!-- =========================================================== --> <!-- extra server options --> <!-- =========================================================== --> <Set name="stopAtShutdown">true</Set> <Set name="stopTimeout">5000</Set> <Set name="dumpAfterStart"><Property name="jetty.dump.start" default="false"/></Set> <Set name="dumpBeforeStop"><Property name="jetty.dump.stop" default="true"/></Set> </Configure>
准备jetty-session.xml,并且修改如下配置:
<Arg>192.168.1.12</Arg> <Arg type="int">8663</Arg>
<?xml version="1.0"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"> <!-- =============================================================== --> <!-- Configure the Jetty Request Log --> <!-- =============================================================== --> <Configure id="Server" class="org.eclipse.jetty.server.Server"> <!-- Configure session id management --> <Set name="sessionIdManager"> <New class="com.ovea.jetty.session.redis.RedisSessionIdManager"> <Arg> <Ref id="Server"/> </Arg> <Arg>session/redis</Arg> <!-- time interval to check for expired sessions in redis cache, in milliseconds. Defaults to 1 min --> <Set name="scavengerInterval">30000</Set> <!-- cluster node name --> <Set name="workerName"> <SystemProperty name="jetty.node" default="web1"/> </Set> </New> </Set> <!-- Provides a Redis Pool for session management on server and each webapp --> <New class="org.eclipse.jetty.plus.jndi.Resource"> <Arg>session/redis</Arg> <Arg> <New class="redis.clients.jedis.JedisPool"> <Arg> <New class="org.apache.commons.pool.impl.GenericObjectPool$Config"> <Set type="int" name="minIdle">5</Set> <Set type="int" name="maxActive">15</Set> <Set type="boolean" name="testOnBorrow">true</Set> </New> </Arg> <Arg>192.168.1.12</Arg> <Arg type="int">8663</Arg> </New> </Arg> </New> </Configure>
Modify jetty 启动脚本
JETTY_ARGS="lib=$JETTY_HOME/lib $APP_HOME/conf/jetty/jetty-cluster.xml $APP_HOME/conf/jetty/jetty-requestlog.xml $APP_HOME/conf/jetty/jetty-session.xml OPTIONS=jsp"
参考资料