nginx+terracotta+freemarker集羣

前一篇文章已經講了nginx+terracotta集羣,但在項目實施時遇到了一些問題,主要是freemarker和webworker版本太低造成的。

1.登陸後後臺執行正常結束,前臺freemarker報錯,錯誤如下。於是升級freemarker最新版本(從2.3.1到2.3.20)

HTTP Status 500- java.io.NotSerializableException: freemarker.ext.servlet.HttpSessionHashModel


type Exceptionreport

message java.io.NotSerializableException:freemarker.ext.servlet.HttpSessionHashModel

description Theserver encountered an internal error that prevented it from fulfilling thisrequest.

exception

java.lang.RuntimeException: java.io.NotSerializableException: freemarker.ext.servlet.HttpSessionHashModel
截圖:

2.升級freemarker後,可正常登陸和操作,但在服務器1登陸後,在同一session中去檢查服務器2,報錯。使用jsp驗證發現服務器2中已存在相關session對象,說明terrecotta正常複製了session。

在類HttpSessionHashModel增加調試信息,發現session和request都是null,而最初是webwork的FreemarkerServlet調入的,於是想找到webwork 2.1.7的源代碼分析,發現時com.opensymphony.webwork.views.freemarker.FreemarkerManager的代碼造成的,而webwork 2.2.6版的代碼已做了相關調整,於是直接修改了FreemarkerManager類的buildScopesHashModel後集羣正常了。
 

HTTP Status 500-


type Exceptionreport

message

description Theserver encountered an internal error that prevented it from fulfilling thisrequest.

exception

java.lang.NullPointerException
        freemarker.ext.servlet.HttpSessionHashModel.get(HttpSessionHashModel.java:122)
        freemarker.core.DynamicKeyName.dealWithStringKey(DynamicKeyName.java:151)
        freemarker.core.DynamicKeyName._eval(DynamicKeyName.java:108)
        freemarker.core.Expression.eval(Expression.java:111)
        freemarker.core.Dot._eval(Dot.java:74)
        freemarker.core.Expression.eval(Expression.java:111)
        freemarker.core.Expression.evalAndCoerceToString(Expression.java:115)
        freemarker.core.DollarVariable.accept(DollarVariable.java:76)
        freemarker.core.Environment.visit(Environment.java:265)
        freemarker.core.MixedContent.accept(MixedContent.java:93)
        freemarker.core.Environment.visit(Environment.java:265)
        freemarker.core.Environment.process(Environment.java:243)
        freemarker.template.Template.process(Template.java:277)
 com.opensymphony.webwork.views.freemarker.FreemarkerServlet.process(FreemarkerServlet.java:229)
  com.opensymphony.webwork.views.freemarker.FreemarkerServlet.doGet(FreemarkerServlet.java:47)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 org.springframework.orm.hibernate.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:171)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
        com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:39)

note The fullstack trace of the root cause is available in the Apache Tomcat/6.0.36 logs.



        //新代碼
        TemplateHashModel sessionModel; 
        //terracotta集羣時,因爲terracotta已經Session copy,所以get ATTR_SESSION_MODEL的對象不爲空,導致無法初始化HttpSessionHashModel對象,故修改
        HttpSession session = request.getSession(false);
        if (session != null) {
          sessionModel = new HttpSessionHashModel(session, wrapper);
          model.put(KEY_SESSION_MODEL,   sessionModel);
          session.setAttribute(ATTR_SESSION_MODEL, sessionModel);               
        } else {
        // no session means no attributes ???
        //            model.put(KEY_SESSION_MODEL, new SimpleHash());
        }
// 原來的代碼        
//        if (request.getSession(false) != null) {
//            HttpSession session = request.getSession();
//
//            synchronized (session) {
//                sessionModel = (HttpSessionHashModel) session.getAttribute(ATTR_SESSION_MODEL);
//             這裏的問題,因爲session數據已通過terracotta共享了,所以不能初始化另外一部機器的類HttpSessionHashModel
//                if (sessionModel == null) {
//                    sessionModel = new HttpSessionHashModel(session, wrapper);
//                    session.setAttribute(ATTR_SESSION_MODEL, sessionModel);
//                }
//            }
//
//            model.put(KEY_SESSION_MODEL, sessionModel);
//        }
//        else {
//            // no session means no attributes ???
//            //            model.put(KEY_SESSION_MODEL, new SimpleHash());
//        }


3.linux下安裝terracotta

java -java terracotta-install.jar -console

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章