CDI and session replication fails
fsotest Jan 14, 2011 6:09 AMMy application uses jsf and cdi on top of jboss 6.0 final. I have deployed it to a jboss cluster consisting of two nodes and an apache server with mod_cluster in front of it. I have attached the xhtml file I am using (it is extremely simple). The cdi bean looks like this
@SessionScoped
@Named
public class Pojo implements Serializable {
private static final Logger logger = LoggerFactory.getLogger(Pojo.class);
private String someField;
public String getSomeField() {
return someField;
}
@Override
public String toString() {
return "[someField, " + someField + "]";
}
public void setSomeField(String someField) {
this.someField = someField;
logger.info("New field value: '{}'", someField);
}
@PostConstruct
public void startup() {
logger.info("Startup");
}
@PreDestroy
public void stop() {
logger.info("Stop");
}
}
Be aware that it is session scoped. The above works fine but it throws an exception in case of a jboss node failover and the request hits the other jboss node. This second node contains the session since I have specified <distributable/> inside the web.xml. The exception thrown is
2011-01-14 10:48:36,738 ERROR[org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/jb.tes.cluster.web]](ajp-127.0.0.1-8209-1) Exception sending request initialized lifecycle event tolistener instance of class org.jboss.weld.servlet.WeldListener:java.lang.NullPointerException
atorg.jboss.weld.context.ForwardingContextual.toString(ForwardingContextual.java:52)[:6.0.0.Final]
atjava.lang.String.valueOf(String.java:2826) [:1.6.0_23]
atjava.lang.StringBuilder.append(StringBuilder.java:115) [:1.6.0_23]
atorg.jboss.weld.context.SerializableContextualInstanceImpl.toString(SerializableContextualInstanceImpl.java:67)[:6.0.0.Final]
atjava.lang.String.valueOf(String.java:2826) [:1.6.0_23]
atjava.lang.StringBuilder.append(StringBuilder.java:115) [:1.6.0_23]
atorg.jboss.weld.context.beanstore.AttributeBeanStore.attach(AttributeBeanStore.java:120)[:6.0.0.Final]
atorg.jboss.weld.context.AbstractBoundContext.activate(AbstractBoundContext.java:75)[:6.0.0.Final]
atorg.jboss.weld.servlet.WeldListener.requestInitialized(WeldListener.java:161)[:6.0.0.Final]
atorg.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:180)[:6.0.0.Final]
atorg.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181)[:6.0.0.Final]
atorg.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:593)[:6.0.0.Final]
atorg.jboss.web.tomcat.service.session.ClusteredSessionValve.handleRequest(ClusteredSessionValve.java:135)[:6.0.0.Final]
atorg.jboss.web.tomcat.service.session.ClusteredSessionValve.invoke(ClusteredSessionValve.java:94)[:6.0.0.Final]
atorg.jboss.web.tomcat.service.session.JvmRouteValve.invoke(JvmRouteValve.java:88)[:6.0.0.Final]
atorg.jboss.web.tomcat.service.session.LockingValve.invoke(LockingValve.java:62)[:6.0.0.Final]
atorg.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.event(CatalinaContext.java:285)[:1.1.0.Final]
atorg.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.invoke(CatalinaContext.java:261)[:1.1.0.Final]
atorg.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88)[:6.0.0.Final]
atorg.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100)[:6.0.0.Final]
atorg.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)[:6.0.0.Final]
atorg.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)[:6.0.0.Final]
atorg.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)[:6.0.0.Final]
atorg.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)[:6.0.0.Final]
atorg.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53)[:6.0.0.Final]
atorg.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362)[:6.0.0.Final]
atorg.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:504)[:6.0.0.Final]
atorg.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:437)[:6.0.0.Final]
atorg.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951)[:6.0.0.Final]
at java.lang.Thread.run(Thread.java:662) [:1.6.0_23]
BTW I got an servlet filter that logs session attributes. The weld session attributes are:
10:42:41,323INFO [dk.jyskebank.cluster.statefulsession.SessionLoggingFilter] Attribute
'org.jboss.weld.context.http.HttpSessionContext#org.jboss.weld.bean-jboss.classloader:id="vfs:///D:/udvikler/jboss/jboss60-cluster/server/node01/farm/jb.tes.cluster.ear/jb.tes.cluster.web.war/"-ManagedBean-classdk.jyskebank.cluster.statefulsession.Pojo'
has value :
Bean: Managed Bean[class dk.jyskebank.cluster.statefulsession.Pojo] with qualifiers [@Any@Default @Named]; Instance: [someField, somevalue]; CreationalContext:org.jboss.weld.context.CreationalContextImpl@100efbb
What am I doing wrong ?
Has anyone tried using CDI in a cluster environment with session replication ?
-
cdi.xhtml.zip 476 bytes