2012-08-23 27 views
10

Chạy trên JSF 2.0.9, Weblogic 10.3.4. Bây giờ chúng tôi đang chạy JSF trong môi trường sản xuất của chúng tôi nhưng đã gặp phải một số vấn đề với phiên sao chép và thất bại hơn. Chúng tôi đang sử dụng viewscope cho đậu của chúng tôi và tôi đã đảm bảo họ là Serializable/thoáng qua và các biến thoáng qua có hiệu quả không quốc tịch. Tuy nhiên phiên không thành công không hoạt động. Tôi đã làm thử nghiệm rộng rãi và được quản lý để làm cho nó làm việc bằng cách thiết lập các params sau trong web.xmlLỗi phiên JSF và Tiết kiệm một phần của tiểu bang

<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> 

Nếu tôi đặt STATE_SAVING_METHOD-server tôi nhận được một ngoại lệ viewexpired trên failover. Nếu tôi đặt để client với PARTIAL_STATE_SAVING để true tôi nhận được lỗi sau:

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) 

Vì vậy, câu hỏi của tôi là những:

  • STATE_SAVING_METHOD-client & PARTIAL_STATE_SAVING - false cách duy nhất tôi sẽ chuyển đổi dự phòng thành công?
  • Chi phí của kết hợp khách hàng/sai là bao nhiêu. Bộ nhớ/cpu này có mở rộng không?
  • Đây có phải là lỗi và nếu có thì giải quyết trong 2.1 hoặc 2.2?

Xin cảm ơn trước.

Trả lời

12

Cuối cùng tôi đã làm việc này nhưng không phải không có thêm một số bit và bobs. Thứ nhất tôi đã thêm dòng sau vào web.xml (có agressive được đánh vần sai):

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

Việc tiết kiệm khách hàng bây giờ là máy chủ và tiết kiệm một phần nhà nước là sai vẫn (true chỉ đơn giản không hoạt động)

Thứ hai sau khi thực hiện một HttpSessionAttributeListener tôi phát hiện ra rằng com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap giữ trạng thái trong phiên chỉ được thêm một lần và không bao giờ gỡ bỏ/thêm/thay thế một lần nữa. Vì vậy, mặc dù nó đã được cập nhật trong phiên địa phương nhưng những thay đổi này chưa bao giờ được nhân rộng thành một jvm thứ hai. Tài liệu Weblogic nói rằng setAttribute phải được gọi trên các thuộc tính phiên để nhân rộng để làm việc. Để khắc phục điều này, tôi đã tạo một trình nghe pha như sau:

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. 
    } 
} 

Việc này chỉ thay thế thuộc tính sau mỗi yêu cầu và đảm bảo sao chép.Là điểm bổ sung, tôi đang hạn chế dữ liệu được lưu trữ trong các chế độ xem với các thông tin sau:

<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> 

Hy vọng điều này sẽ giúp mọi người có cùng vấn đề.

0

Việc sao chép phiên phải được xử lý bởi trình cân bằng tải khi ứng dụng JSF chỉ biết về ngữ cảnh trên nút mà nó được triển khai. Do đó, bạn không nên đặt STATE_SAVING_METHOD thành máy khách hoặc máy chủ.

Nghe có vẻ như tôi có cấu hình cân bằng tải không chính xác. Nếu bạn đang sử dụng Apache HTTP Server như proxy của bạn xin vui lòng xem link sau để biết thêm thông tin về phiên stickyness:

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

tôi sẽ khuyên bạn nên thiết ProxySet stickysession = ROUTEID và xem có khắc phục vấn đề này.

+0

Chúng tôi có IIS. Phiên sao chép được xử lý bởi weblogic và không phải là cân bằng tải. Đã có phiên cố định nhưng đây không phải là vấn đề. Vấn đề là sự thất bại của phiên làm việc không thành công đến một jvm mới. – andyfinch

+0

Nếu bạn đã đặt phiên cố định trên máy chủ weblogic, máy chủ weblogic sẽ tạo một cookie chỉ với thông tin phiên người dùng trên nút đó. Tôi đoán là cookie này không được chuyển sang nút thứ hai khi một chuyển đổi dự phòng xảy ra vì cá thể weblogic chỉ biết về chính nó. Đó là lý do tại sao tôi nói rằng bạn nên thử và bật các phiên dính trên Load Balancer vì cân bằng tải có thể truyền cookie đến nút thứ hai. –

+0

Cảm ơn nhưng tôi không nghĩ rằng tôi đã rõ ràng trong câu hỏi ban đầu của tôi. Phiên sao chép đang diễn ra nhưng không chính xác với các phiên JSF. Chỉ một phần của ứng dụng của chúng tôi sử dụng JSF tại các phiên mo và không jsf đang sao chép ok. – andyfinch

Các vấn đề liên quan