I have a modular application running on appengine. Since each module has 
it's own resources (static files) I use a Filter to serve these resources.

My problem is that some resources take over one second to be served while 
others are served fast.


As you can see below I already measured the time my Filter takes... This is 
always around a few milliseconds. Where could the extra second come from?It 
is not the startup time of the appengine since it was already startet by 
the html request.


I use Guice to call the Filter and the side itself is served by Wicket.


Here is the code of my ServletModule:

filter("/*").through(ResourceFilter.class);

filter("/*").through(WicketFilter.class, new HashMap<String, String>() {{
    put("injectorContextAttribute", Injector.class.getName());
    if (deployment) {
        put("configuration", "deployment");
    }
    put(WicketFilter.FILTER_MAPPING_PARAM, "/*");
    put(WicketFilter.IGNORE_PATHS_PARAM, ignorePaths);
    put(WicketFilter.APP_FACT_PARAM, 
GuiceWebApplicationFactory.class.getName());
}});
bind(WicketFilter.class).in(Singleton.class);

And this is the code of my Filter:

@Singleton
public class ResourceFilter implements Filter {

    private static final Logger LOGGER = 
LoggerFactory.getLogger(ResourceFilter.class);

    private final RootSite rootSite;

    @Inject
    public ResourceFilter(RootSite rootSite) {
       this.rootSite = rootSite;
    }

    public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain chain) throws IOException, ServletException {
        long start = System.currentTimeMillis();
        URL resource = null;
        String path;
        if (request instanceof HttpServletRequest) {
            path = ((HttpServletRequest) request).getRequestURI();
            resource = rootSite.getResource(path);
        } else {
            path = null;
        }
        if (resource != null) {
            try (InputStream in = resource.openStream();
                 OutputStream out = response.getOutputStream()) {
                String contentType;
                if (resource.getPath().endsWith(".html")) {
                    contentType = "text/html";
                } else if (resource.getPath().endsWith(".css")) {
                    contentType = "text/css";
                } else {
                    contentType = "application/octet-stream";
                }
                response.setContentType(contentType);
                byte[] bytes = new byte[4096];
                int len;
                while ((len = in.read(bytes)) > 0) {
                    out.write(bytes, 0, len);
                }
            }
        } else if (chain != null) {
            chain.doFilter(request, response);
        }
        long time = System.currentTimeMillis() - start;
        LOGGER.info(path + ": " + time + " ms");
    }

}

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to google-appengine+unsubscr...@googlegroups.com.
To post to this group, send email to google-appengine@googlegroups.com.
Visit this group at https://groups.google.com/group/google-appengine.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-appengine/d3360fe5-55e4-4415-9d21-140e284d148e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to