Terracotta
From Resin 3.0
(Difference between revisions)
(checkpoint) |
|||
Line 1: | Line 1: | ||
== Terracotta and Resin == | == Terracotta and Resin == | ||
+ | |||
+ | |||
+ | '''WARNING: THE FOLLOWING IS INCOMPLETE AND IN PROGRESS!''' | ||
+ | |||
<ol> | <ol> | ||
Line 6: | Line 10: | ||
<li>Download Terracotta from http://www.terracotta.org</li> | <li>Download Terracotta from http://www.terracotta.org</li> | ||
<li>Unzip Terracotta</li> | <li>Unzip Terracotta</li> | ||
+ | <li>Create the Mule webapp directory structure: | ||
+ | <pre>mkdir -p /usr/local/share/resin/webapps/terracotta/WEB-INF/lib/ | ||
+ | mkdir -p /usr/local/share/resin/webapps/terracotta/WEB-INF/classes/example/ | ||
+ | </pre> | ||
+ | </li> | ||
+ | <li>Create the configuration file <code>/usr/local/share/resin/webapps/mule/WEB-INF/resin-web.xml</code> | ||
+ | <pre><?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> | ||
+ | </pre> | ||
+ | </li> | ||
+ | <li>Create the configuration file <code>/usr/local/share/resin/tc-config.xml</code> | ||
+ | <pre><?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> | ||
+ | </pre></li> | ||
+ | <li>Create the HelloWorld Servlet <code>/usr/local/share/resin/webapps/terracotta/WEB-INF/classes/example/HelloWorldServlet.java</code> | ||
+ | <pre>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>"); | ||
+ | } | ||
+ | } | ||
+ | }</pre> | ||
+ | </li> | ||
+ | <li>Create two copies of resin.conf, with different ports for the server and http. Add these lines to both versions of resin.conf | ||
+ | <pre> | ||
+ | <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> | ||
+ | </pre> | ||
+ | </li> | ||
+ | <li>Invoke two Resin instances, using the two different resin.confs</li> | ||
</ol> | </ol> |
Revision as of 02:26, 18 February 2008
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/lib/ 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