Slug - The Slow Web Processes Manager


Jumpstart HowTo

To implement Slug based web process monitoring an application needs to implement the following steps:

  1. Add Slug servlet and session listener to the web application deployment descriptor web.xml:
  2. <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4"
     xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
     	...
        <!-- Slug session cleaner -->
        <listener>
            <description>HttpSessionListener</description>
            <listener-class>com.webhydra.slug.SlugCleaner</listener-class>
        </listener>
        <!-- End Slug session cleaner -->
    	 ...
        <!-- Slug servlet definition -->
        <servlet>
            <servlet-name>SlugServlet</servlet-name>
            <servlet-class>com.webhydra.slug.Slug</servlet-class>
            <init-param>
                <description>Configurations file with the runners and translators definitions.</description>
                <param-name>config</param-name>
                <param-value>/WEB-INF/slug.properties</param-value>
            </init-param>
            <init-param>
                <description>Configurations file parser (ISlugConfigParser) class implementation.</description>
                <param-name>parser</param-name>
                <param-value>com.webhydra.slug.PropertiesConfigParser</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    	 ...
        <servlet-mapping>
            <servlet-name>SlugServlet</servlet-name>
            <url-pattern>/slug/*</url-pattern>
        </servlet-mapping>
        <!-- End Slug servlet definition -->
    	 ...
    </web-app>
    


  3. Create conficurations file /WEB-INF/slug.properties from sterp one:
  4. # Define a runner
    slug.runners=unlimited
    # runner's class implementation
    slug.runner[unlimited].impl=com.webhydra.slug.process.UnlimitedProcessRunner
    
    # Define a translator
    slug.translators=js
    # translator's class implementation
    slug.translator[js].impl=com.webhydra.slug.process.javascript.JavaScriptProcessStatusTranslator
    


    Multiple runners and translators can be defined as in the following example:

    # Define multiple translators
    slug.translators=xml-xsd,xml-dtd,js
    # translator's class implementations
    slug.translator[xml-xsd].impl=com.webhydra.slug.process.xml.XmlXsdProcessStatusTranslator
    slug.translator[xml-dtd].impl=com.webhydra.slug.process.xml.XmlDtdProcessStatusTranslator
    slug.translator[js].impl=com.webhydra.slug.process.javascript.JavaScriptProcessStatusTranslator
    


  5. Define "slow" process implementation by extending com.webhydra.slug.process.SluggishProcess class:
  6. package demo;
    
    import com.webhydra.slug.process.ProcessProgress;
    import com.webhydra.slug.process.ProcessStatus;
    import com.webhydra.slug.process.SluggishProcess;
    import com.webhydra.slug.process.Status;
    
    /**
     * Sluggish process for demo purposes.
     */
    public class MySluggishPorcess extends SluggishProcess {
    
        /**
         * Simple SluggishProcess implementation.
         */
        public ProcessStatus execute() throws InterruptedException {
            // reprot process as started.
            setProcessStatus(new ProcessProgress(Status.RUNNING, "Started.", 0));
    		  doSomething();
            setProcessStatus(new ProcessProgress(Status.RUNNING, "Task one done.", 30));
    		  doSomethingElse();
            setProcessStatus(new ProcessProgress(Status.RUNNING, "Task two done.", 80));
    		  doSomethingMore();
            return new ProcessProgress(Status.COMPLETED, "Done!", 99);
        }
    }
    


  7. Instantiate the "slow" process and obtain its PID and save it as request attribute:
  8. 	String pid = SlugHelper.runProcess(request, new MySluggishPorcess());
    	request.setAttribute("pid", pid);
    

  9. Monitor the process using:
    1. AJAX:
    2. <%@page contentType="text/html" pageEncoding="UTF-8" %>
      <%@taglib uri="http://dev.webhydra.com/jstl/slug.tld" prefix="slug" %>
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <HTML>
        <HEAD>
          <TITLE>Simple process with simple status and JavaScript raw translator.</TITLE>
          <slug:script />
          <slug:manage pid="<%= request.getAttribute(pid) %>" url="/slug" translator="js">
              document.getElementById("prStatus").innerHTML = ps.toString();
          </slug:manage>
        </HEAD>
        <BODY>
          <CENTER>
              Simple status:</br>
              <DIV id="prStatus">Slug Status here</DIV>
          </CENTER>
        </BODY>
      </HTML>
      


      The above example is extremely simplified. Please see provided demo application for more real life like implementations.

    3. Native JSP:
    4. <%@page contentType="text/html" pageEncoding="UTF-8"
      import="com.webhydra.slug.*,com.webhydra.slug.process.*"
      %>
      <%@taglib uri="http://dev.webhydra.com/jstl/slug.tld" prefix="slug" %>
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <HTML>
        <HEAD>
      <%
        String pid = request.getParameter("pid");
        ProcessStatus ps = null;
        if (pid == null)
        {
        	// get new pid as request attribute
        	pid = request.getAttribute("pid");
        }
        // get Status
        Status s = null;
        ps = SlugHelper.getStatus(request, pid);
        if (ps != null)
        {
          s = ps.getStatus();
          if (Status.isCompleted(s))
          {
            // consume completed process
            SluggishProcess sp = SlugHelper.consumeProcess(request, pid);
          }
          else
          {
      %>
          <!-- set refresh time to a second -->
          <META HTTP-EQUIV="refresh" CONTENT="1;url=my.jsp?pid=<%= pid %>">
      <%
          }
        }
      %>
          <TITLE>Simple process with simple status.</TITLE>
        </HEAD>
        <BODY>
          <CENTER>
              Simple status:</br>
              <%= s %>
          </CENTER>
        </BODY>
      </HTML>


      The above example is extremely simplified. Please see provided demo application for more real life like implementations.


Copyright (c) 2006, WebHydra.com. All rights reserved.