Terracotta
From Resin 3.0
Terracotta and Resin
WARNING: THE FOLLOWING IS INCOMPLETE AND IN PROGRESS!
(The following has been tested with Resin 3.1.5 and Terracotta 2.5.4)
- Download Resin from http://www.caucho.com/download
- Unzip Resin. From now on, we'll refer to the location of the Resin root directory as $RESIN
- Download Terracotta from http://www.terracotta.org
- Unzip Terracotta. From now on, we'll refer to the location of the Terracotta root directory as $TERRACOTTA
- Create the example webapp directory structure:
mkdir -p $RESIN/webapps/terracotta/WEB-INF/classes/example/
- Create the configuration file
$RESIN/webapps/terracotta/WEB-INF/resin-web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://caucho.com/ns/resin"> <servlet servlet-name="hello-servlet" servlet-class="example.HelloWorldServlet"/> <servlet-mapping url-pattern="/*" servlet-name="hello-servlet"/> </web-app>
- Create the HelloWorld Servlet
/usr/local/share/resin/webapps/terracotta/WEB-INF/classes/example/HelloWorldServlet.java
package example; import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldServlet extends HttpServlet { // this is the variable that Terracotta will distribute private ArrayList<Calendar> _accessTimes = new ArrayList<Calendar>(); @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Calendar now = Calendar.getInstance(); synchronized(_accessTimes) { _accessTimes.add((Calendar) now.clone()); DateFormat format = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z"); resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<body>"); for (Calendar calendar : _accessTimes) { out.println("<br/>" + format.format(calendar.getTime())); } out.println("</body>"); out.println("</html>"); } } }
- Create the Terracotta configuration file
$RESIN/tc-config.xml
<?xml version="1.0" encoding="UTF-8"?> <tc:tc-config xmlns:tc="http://www.terracotta.org/config"> <application> <dso> <roots> <root> <field-name>example.HelloWorldServlet._accessTimes</field-name> </root> </roots> <locks> <autolock> <method-expression>* example.HelloWorldServlet*.*(..)</method-expression> <lock-level>write</lock-level> </autolock> </locks> <instrumented-classes> <include><class-expression>example..*</class-expression></include> </instrumented-classes> <additional-boot-jar-classes> <include>java.util.TimeZone</include> <include>sun.util.calendar.ZoneInfo</include> </additional-boot-jar-classes> </dso> </application> </tc:tc-config>
- Create the Terracotta boot jar:
$TERRACOTTA/bin/make-boot-jar.sh -f $RESIN/tc-config.xml
Note the path of the boot jar created by this command. You will use it in the next step.
- Edit resin.conf, making the following changes:
-
<jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg> <jvm-arg>-Xbootclasspath/p:<path-to-boot-jar></jvm-arg> <jvm-arg>-Dtc.install-root=<path-to-terracotta></jvm-arg> <jvm-arg>-Dtc.config=localhost:9510</jvm-arg>
Make sure to replace the <path-to-boot-jar> and <path-to-terracotta>.
-
Remove the line
<http address="*" port="8080"/>
from <server-default> section. -
Remove the default server line
<server id="" address="127.0.0.1" port="6800"/>
-
Add two servers:
<server id="a" address="127.0.0.1" port="6800"> <http address="*" port="8080"/> </server> <server id="b" address="127.0.0.1" port="6801"> <http address="*" port="8081"/> </server>
-
- Start the Terracotta server:
$TERRACOTTA/bin/start-tc-server.sh -f $RESIN/tc-config.xml
- Start both Resin servers:
cd $RESIN java -jar lib/resin.jar -server a start java -jar lib/resin.jar -server b start
- Browse to http://localhost:8080/terracotta and hit refresh a few times. You should see a date added to the page on each refresh.
- Open another browser window to http://localhost:8081/terracotta. You should see the same dates from the previous page, but with one now added.
-
You can run
$TERRACOTTA/bin/admin.sh
to see the details of the shared objects that Terracotta is managing.