Terracotta
From Resin 3.0
Terracotta and Resin
WARNING: THE FOLLOWING IS INCOMPLETE AND IN PROGRESS!
- Download Resin from http://www.caucho.com/download
- Unzip Resin into
/usr/local/share/resin
- Download Terracotta from http://www.terracotta.org
- Unzip Terracotta
- Create the Mule webapp directory structure:
mkdir -p /usr/local/share/resin/webapps/terracotta/WEB-INF/classes/example/
- Create the configuration file
/usr/local/share/resin/webapps/mule/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 configuration file
/usr/local/share/resin/tc-config.xml
<?xml version="1.0" encoding="UTF-8"?> <tc:tc-config xmlns:tc="http://www.terracotta.org/config"> <clients> <dso> <debugging> <instrumentation-logging> <class>true</class> <hierarchy>true</hierarchy> <locks>true</locks> <transient-root>true</transient-root> <roots>true</roots> <distributed-methods>true</distributed-methods> </instrumentation-logging> <runtime-logging> <lock-debug>true</lock-debug> <field-change-debug>true</field-change-debug> <wait-notify-debug>true</wait-notify-debug> <distributed-method-debug>true</distributed-method-debug> <new-object-debug>true</new-object-debug> </runtime-logging> </debugging> </dso> </clients> <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 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 two copies of resin.conf, with different ports for the server and http. Add these lines to both versions of resin.conf
<jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg> <jvm-arg>-Xbootclasspath/p:<path-to-terracotta>/lib/dso-boot/<dso-boot-jar></jvm-arg> <jvm-arg>-Dtc.install-root=<path-to-terracotta></jvm-arg> <jvm-arg>-Dtc.config=localhost:9510</jvm-arg>
- Invoke two Resin instances, using the two different resin.confs