2012-08-23 8 views
10

जेएसएफ 2.0.9, वेबलॉगिक 10.3.4 पर चल रहा है। अब हम अपने उत्पादन माहौल में जेएसएफ चला रहे हैं लेकिन सत्र प्रतिकृति के साथ कुछ मुद्दों का सामना करना पड़ा है और विफल हो गया है। हम अपने सेम के लिए व्यूस्कोप का उपयोग कर रहे हैं और मैंने सुनिश्चित किया है कि वे सीरियलज़ेबल/क्षणिक हैं और क्षणिक चर प्रभावी ढंग से स्टेटलेस हैं। हालांकि सत्र विफल हो रहा है काम नहीं कर रहा है। मैं व्यापक परीक्षण किया है और यह web.xmlजेएसएफ सत्र विफल और आंशिक राज्य बचत

<context-param> 
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
     <param-value>client</param-value> 
    </context-param> 


    <context-param> 
     <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name> 
     <param-value>false</param-value> 
    </context-param> 

में निम्नलिखित पैरामीटर की स्थापना अगर मैं सेट STATE_SAVING_METHODserver को मैं विफलता पर एक viewexpired अपवाद द्वारा काम कर पाने में कामयाब रहे। अगर मैं true को PARTIAL_STATE_SAVING साथ client करने के लिए सेट मैं निम्नलिखित त्रुटि मिलती है:

  • STATE_SAVING_METHOD है - client & PARTIAL_STATE_SAVING - false एक ही रास्ता मैं करने जा रहा हूँ:

    java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
        at java.util.ArrayList.RangeCheck(ArrayList.java:547) 
        at java.util.ArrayList.get(ArrayList.java:322) 
        at javax.faces.component.AttachedObjectListHolder.restoreState(AttachedObjectListHolder.java:165) 
        at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1433) 
        at com.sun.faces.application.view.StateManagementStrategyImpl$1.visit(StateManagementStrategyImpl.java:265) 
        at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151) 
        at javax.faces.component.UIComponent.visitTree(UIComponent.java:1507) 
        at javax.faces.component.UIComponent.visitTree(UIComponent.java:1521) 
        at com.sun.faces.component.visit.VisitUtils.doFullNonIteratingVisit(VisitUtils.java:75) 
        at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:282) 
        at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:181) 
        at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123) 
        at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:448) 
        at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:148) 
        at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:187) 
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
        at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:111) 
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:508) 
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) 
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) 
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301) 
        at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:27) 
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:57) 
        at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27) 
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:57) 
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3730) 
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3696) 
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) 
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2273) 
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179) 
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1490) 
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256) 
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:221) 
    

    तो मेरे सवालों इन कर रहे हैं काम करने में विफलता पाएं?

  • ग्राहक/झूठी संयोजन की लागत क्या है। क्या यह स्मृति/सीपीयू व्यापक है?
  • क्या यह एक बग है और यदि ऐसा है तो यह 2.1 या 2.2 में हल हो गया है?

अग्रिम धन्यवाद।

उत्तर

12

मुझे अंततः यह काम मिल गया लेकिन कुछ अतिरिक्त बिट्स और बॉब्स के बिना नहीं। सबसे पहले मैं (हाँ आक्रामक गलत तरीके से लिखा जाता है) web.xml के लिए निम्न कहा:

<context-param> 
     <param-name>com.sun.faces.enableAgressiveSessionDirtying</param-name> 
     <param-value>true</param-value> 
    </context-param> 

ग्राहक बचत सर्वर और आंशिक राज्य की बचत झूठी अभी भी (सच बस काम नहीं करता है) अब है

एक HttpSessionAttributeListener को लागू करने के बाद दूसरा, मैंने पाया कि com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap जो सत्र में राज्य को केवल एक बार जोड़ता है और कभी भी हटा/जोड़ा/प्रतिस्थापित नहीं किया जाता है। इसलिए हालांकि स्थानीय सत्र में इसे अपडेट किया जा रहा था, लेकिन इन बदलावों को कभी भी दूसरे जेवीएम में दोहराया नहीं गया था। वेबलॉगिक दस्तावेज़ बताते हैं कि सेट एट्रिब्यूट को प्रतिकृति के लिए सत्र गुणों पर कॉल किया जाना चाहिए।

public class ViewPhaseListener implements PhaseListener { 

    public void afterPhase(PhaseEvent phaseEvent) 
    { 

    } 

    public void beforePhase(PhaseEvent phaseEvent) 
    { 
     HttpServletRequest request = ((HttpServletRequest) phaseEvent.getFacesContext().getExternalContext().getRequest()); 
     HttpSession session = request.getSession(); 

     session.setAttribute("com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap", session.getAttribute("com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap")); 

    } 

    public PhaseId getPhaseId() 
    { 
     return PhaseId.RENDER_RESPONSE; 
      //To change body of implemented methods use File | Settings | File Templates. 
    } 
} 

यह केवल प्रत्येक अनुरोध के बाद विशेषता बदल देता है और यह प्रतिकृति सुनिश्चित करता है: इसे ठीक करने के मैं इस प्रकार एक चरण श्रोता बनाया।

<context-param> 
     <param-name>com.sun.faces.numberOfViewsInSession</param-name> 
     <param-value>3</param-value> 
    </context-param> 

    <context-param> 
     <param-name>com.sun.faces.numberOfLogicalViews</param-name> 
     <param-value>1</param-value> 
    </context-param> 

आशा यह एक ही मुद्दों के साथ किसी को भी मदद करता है: एक अतिरिक्त अंक के रूप में मैं निम्नलिखित के साथ विचारों में संग्रहीत डेटा को सीमित कर रहा हूँ।

0

सत्र प्रतिकृति लोड बैलेंसर द्वारा संभाली जानी चाहिए क्योंकि जेएसएफ एप्लिकेशन केवल उस नोड पर संदर्भ के बारे में जागरूक है जिसे इसे तैनात किया गया है। इस प्रकार, इससे कोई फर्क नहीं पड़ता कि आप STATE_SAVING_METHOD को क्लाइंट या सर्वर पर सेट करना चाहते हैं।

ऐसा लगता है कि आपके पास गलत लोड बैलेंसर कॉन्फ़िगरेशन है। आप अपने प्रॉक्सी के रूप में अपाचे HTTP सर्वर उपयोग कर रहे हैं तो कृपया सत्र स्टिकीपन बारे में अधिक जानकारी के लिए नीचे दिए गए लिंक देखें:

http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html

मैं ProxySet stickysession = ROUTEID करने का सुझाव देते हैं और देखते हैं कि क्या इससे समस्या होगी।

+0

हमारे पास आईआईएस है। सत्र प्रतिकृति वेबलॉगिक द्वारा संभाली जाती है न कि लोड बैलेंसर। चिपचिपा सत्र चालू है लेकिन यह मुद्दा नहीं है। मुद्दा एक नए जेवीएम के लिए सही ढंग से विफल होने के सत्र की विफलता है। – andyfinch

+0

यदि आपने वेबलॉगिक सर्वर पर चिपचिपा सत्र सेट किया है, तो वेबलॉग सर्वर केवल उस नोड पर उपयोगकर्ता सत्र जानकारी के साथ कुकी बनायेगा। मेरा अनुमान है कि यह कुकी दूसरे नोड पर नहीं जाती है जब एक विफलता तब होती है जब वेबलॉगिक इंस्टेंस केवल खुद के बारे में पता होता है। यही कारण है कि मैंने कहा कि आपको लोड बैलेंसर पर चिपचिपा सत्रों को आजमाकर चालू करना चाहिए क्योंकि लोड बैलेंसर कुकी को दूसरे नोड में पास करने में सक्षम है। –

+0

धन्यवाद लेकिन मुझे नहीं लगता कि मैं अपने प्रारंभिक प्रश्न में स्पष्ट था। सत्र प्रतिकृति हो रही है लेकिन जेएसएफ सत्रों के साथ बिल्कुल सही नहीं है। हमारे ऐप का केवल एक हिस्सा एमओएफ पर जेएसएफ का उपयोग करता है और गैर जेएसएफ सत्र ठीक से दोहरा रहे हैं। – andyfinch

संबंधित मुद्दे