To achive good result need to hack the VelocityLayoutView. Create a derived class put rendering result into cache. Solution became two times faster. Guess not a bad result.
1: public class DerivedVelocityLayoutView extends VelocityLayoutView {
2:
3: // skipped
4:
5: private oncurrentMap<String, String> cache;
6:
7: // skipped
8:
9: /**
10: * Default constructor.
11: */
12: public DerivedVelocityLayoutView() {
13: super();
14: this.requestHelper = new RequestHelperImpl();
15: this.cache = new MapMaker()
16: .concurrencyLevel(16)
17: .softValues()
18: .expiration(3, TimeUnit.MINUTES)
19: .makeMap();
20: }
21:
22: // skipped
23:
24: /**
25: * The resulting context contains any mappings from render, plus screen content.
26: * @param velocityContext context.
27: * @throws Exception in case of exception
28: */
29: private void renderScreenContent(final Context velocityContext) throws Exception {
30:
31: if (logger.isDebugEnabled()) {
32: logger.debug("Rendering screen content template [" + getUrl() + "]");
33: }
34:
35: final HttpServletRequest servletRequest = (HttpServletRequest) velocityContext.get("request");
36: final String key = getKey(velocityContext);
37:
38: String renderedPage = cache.get(key);
39: if (renderedPage == null) {
40: StringWriter sw = new StringWriter();
41: Template screenContentTemplate = getTemplate(getUrl());
42: screenContentTemplate.merge(velocityContext, sw);
43: renderedPage = sw.toString();
44: if (isCacheAllowed(servletRequest.getRequestURI())) {
45: cache.put(key, renderedPage);
46: if (logger.isDebugEnabled()) {
47: logger.debug("Cache miss " + key);
48: }
49: }
50: } else {
51: if (logger.isDebugEnabled()) {
52: logger.debug("Cache hit " + key);
53: }
54: }
55: // Put rendered content into Velocity context.
56: velocityContext.put(this.screenContentKey, renderedPage);
57: }
58:
59: // skipped
60:
61: }
62: