viewscope sessionscoped close bean applicationscoped ambitos jsf session jboss cdi

jsf - sessionscoped - Demasiadas sesiones activas



managed bean scope view</ managed bean scope (1)

¿Por qué el servidor crea demasiadas sesiones?

Debido a que envió unos cientos de solicitudes y el servidor aparentemente está configurado para crear sesiones X máx.

Utilicé RequestScope y Stateless Bean, ¿cómo es que terminan en sesión?

Ellos no lo hicieron. El estado de la vista JSF sí. Al configurar el método de ahorro de estado JSF en el server , que es la configuración predeterminada, JSF almacenará el estado de la vista en la sesión HTTP.

¿Qué puedo hacer para superar esta situación?

Establezca el método de ahorro de estado JSF en el client mediante este parámetro de contexto en web.xml .

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

De esta forma, el estado de la vista JSF en forma serializada se almacenará en el campo de entrada oculto javax.faces.ViewState del formulario JSF en lugar de en la sesión HTTP.

O bien, cuando utilice Mojarra 2.1.19 o posterior, simplemente desactive el ahorro de estado JSF según la vista estableciendo el atributo transient de <f:view> en true .

<f:view transient="true">

(Puede ajustar <f:view> alrededor de <h:head> / <h:body> ; esto también es lo que JSF está haciendo implícitamente: representa el componente UIViewRoot )

Ver también:

Estoy usando JSF 2 en JBoss 6. Hice una aplicación de muestra que utiliza JSF como la Vista, EJB para la lógica y JPA para Persistencia. El bean en JSF tiene RequestScoped. EJB es sin estado:

<?xml version=''1.0'' encoding=''UTF-8'' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:c="http://java.sun.com/jsp/jstl/core"> <h:head> <title>Long HDi</title> </h:head> <h:body> <c:forEach var="tweet" items="#{tweets.getAll}"> <p> #{tweet.content}<br /> </p> </c:forEach> </h:body> </html>

Frijol:

@Named("tweets") @RequestScoped public class Tweets implements Serializable { @EJB private TweetServiceLocal tweetService; private List<Tweet> tweets; public List<Tweet> getGetAll() { return tweetService.findAllSortedByTimeDesc(); } }

EJB:

@Stateless public class TweetService implements TweetServiceLocal { @PersistenceContext(unitName = "LongHDi-ejbPU") private EntityManager em; @Override public Tweet create(final String content, final Date postTime) throws ContentTooLargeException { if (content.length() > 480) throw new ContentTooLargeException("Content must have less than 480 charaters!"); else { try { Tweet tweet = new Tweet(); tweet.setContent(content); tweet.setPostTime(postTime); em.persist(tweet); return tweet; } catch (Exception e) { return null; } } } @Override public java.util.List<Tweet> findAllSortedByTimeDesc() { return em.createNamedQuery("Tweet.findAllSortedByTimeDesc").getResultList(); } }

Cuando le envío cientos de solicitudes, el servidor JBoss 6 lanza esta excepción:

JBWEB000065: HTTP Status 500 - JBWEB000209: Session creation failed due to too many active sessions JBWEB000309: type JBWEB000066: Exception report JBWEB000068: message JBWEB000209: Session creation failed due to too many active sessions JBWEB000069: description JBWEB000145: The server encountered an internal error that prevented it from fulfilling this request. JBWEB000070: exception javax.servlet.ServletException: JBWEB000209: Session creation failed due to too many active sessions javax.faces.webapp.FacesServlet.service(FacesServlet.java:606) JBWEB000071: root cause java.lang.IllegalStateException: JBWEB000209: Session creation failed due to too many active sessions org.apache.catalina.session.StandardManager.createSession(StandardManager.java:297) org.apache.catalina.connector.Request.doGetSession(Request.java:2651) org.apache.catalina.connector.Request.getSession(Request.java:2357) org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:790) com.sun.faces.context.ExternalContextImpl.getSession(ExternalContextImpl.java:157) com.sun.faces.application.view.FaceletViewHandlingStrategy.getSession(FaceletViewHandlingStrategy.java:494) com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:400) com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:124) javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:286) com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)

Mi pregunta es: ¿por qué el servidor crea demasiadas sesiones? Utilicé RequestScope y Stateless Bean, ¿cómo es que terminan en sesión? ¿Qué puedo hacer para superar esta situación? Si utilizo solo servlet y JSP, cuando hay demasiadas solicitudes, el servidor se ralentiza, pero al menos no se detiene así.