view servlet/src/digilib/servlet/AsyncServletWorker.java @ 804:587c90bc5976 stream

first version using officially approved Servlet 3.0 async support.
author robcast
date Sat, 19 Feb 2011 22:01:12 +0100
parents
children a23c4c15a6a8
line wrap: on
line source

/**
 * 
 */
package digilib.servlet;

import java.io.IOException;

import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import digilib.image.DocuImage;
import digilib.image.ImageJobDescription;
import digilib.image.ImageOpException;
import digilib.image.ImageWorker;
import digilib.servlet.Scaler.ErrMsg;
import digilib.servlet.Scaler.Error;

/**
 * @author casties
 * 
 */
public class AsyncServletWorker implements Runnable {

    /** the AsyncServlet context */
    private AsyncContext asyncContext;

    /** the ImageWorker we use */
    private ImageWorker imageWorker;

    protected static Logger logger = Logger.getLogger(AsyncServletWorker.class);
    private long startTime;
    ErrMsg errMsgType = ErrMsg.IMAGE;

    /**
     * @param dlConfig
     * @param jobinfo
     */
    public AsyncServletWorker(DigilibConfiguration dlConfig,
            ImageJobDescription jobinfo, AsyncContext asyncContext,
            ErrMsg errMsgType, long startTime) {
        // set up image worker
        imageWorker = new ImageWorker(dlConfig, jobinfo);
        // save AsyncContext
        this.asyncContext = asyncContext;
        this.startTime = startTime;
        this.errMsgType = errMsgType;
    }

    /**
     * runs the ImakeWorker and writes the image to the ServletResponse.
     */
    public void run() {
        // get fresh response
        HttpServletResponse response = (HttpServletResponse) asyncContext.getResponse();
        try {
            // render the image
            DocuImage img = imageWorker.call();
            // send image
            ServletOps.sendImage(img, null, response, logger);
            logger.debug("Job Processing Time: "
                    + (System.currentTimeMillis() - startTime) + "ms");
        } catch (ImageOpException e) {
            logger.error(e.getClass() + ": " + e.getMessage());
            Scaler.digilibError(errMsgType, Error.IMAGE, null, response);
        } catch (IOException e) {
            logger.error(e.getClass() + ": " + e.getMessage());
            Scaler.digilibError(errMsgType, Error.FILE, null, response);
        } catch (ServletException e) {
            logger.error("Servlet error: ", e);
        } finally {
            // submit response
            asyncContext.complete();
        }

    }

}