1 Reply Latest reply on May 20, 2011 10:28 AM by michael.zeising

    "Could not find Stateful bean" exception breaks session

    mighty

      I am using JBoss 4.0.4 GA Patch1 with the EJB3 profile to deploy an application based on JSF and EJB3. There are several Stateful Session Beans in the application which are accessed from JSF managed beans with a session scope. Here are some code snippets...

      The SFSB

      @Local
      public interface BudgetManager {
      
       public Budget getBudgetByPeriodAndUnit(ReportingPeriod period, Unit unit);
      
       //other methods
      
      }
      
      
      @Stateful
      @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
      public class BudgetManagerBean implements BudgetManager {
      
       @PersistenceContext(type=PersistenceContextType.EXTENDED)
       protected EntityManager em;
      
       public Budget getBudgetByPeriodAndUnit(ReportingPeriod period, Unit unit) {
       Budget budget = (Budget) em
       .createQuery("from Budget where isunit = :unit and reportingPeriod = :period")
       .setParameter("unit", unit).setParameter("period", period)
       .getSingleResult();
      
       return budget;
       }
       // other methods
      }
      


      The JSF managed bean

      public class RaidStatusBean {
       private BudgetManager budgetManager;
      
       public RaidStatusBean() {
       try {
       InitialContext ctx = new InitialContext();
       budgetManager = (BudgetManager) ctx
       .lookup("appName/BudgetManagerBean/local");
       } catch (NamingException e) {
       // Log stuff
       }
      
       }
      
       public String display() {
      
       budget = budgetManager.getBudgetByPeriodAndUnit(this.period, this.unit);
       }
      
       // other methods
      }
      


      The call to display works fine for the first time, but fails afterwards if the time between calls on the SFSB > timeout of the SimpleStatefulCache. The stack trace is:

      Caused by: javax.ejb.EJBNoSuchObjectException: Could not find Stateful bean: a15221p-a8v0ft-eqgdcg5b-1-eqgfc9wj-4j at org.jboss.ejb3.cache.simple.SimpleStatefulCache.get(SimpleStatefulCac
      he.java:266)
      at org.jboss.ejb3.stateful.StatefulInstanceInterceptor.invoke(StatefulInstanceInterceptor.java:59)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:78)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.stateful.StatefulContainer.localInvoke(StatefulContainer.java:199)
      at org.jboss.ejb3.stateful.StatefulLocalProxy.invoke(StatefulLocalProxy.java:98)
      at $Proxy376.getUsersByUnitAndAppUser(Unknown Source)
      at com.xxx.yyy.action.RaidStatusBean.refresh(RaidStatusBean.java:269)
      at com.xxx.yyy.action.RaidStatusBean.display(RaidStatusBean.java:201)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:129)
       ... 34 more



      I have also added lifecycle callbacks, and only the @PostConstruct method is called, the @PrePassivate, @PostActivate, @PreDestroy and @Remove methods are never called.

      Now if I add the @Cache(org.jboss.ejb3.cache.NoPassivationCache.class) annotation to the SFSB, then everything works fine, as expected.

      This looks to me like a problem with the SimpleStatefulCache, since it should be transparent to the application. Is there a way to work around this issue, without using the NoPassivationCache ? Could this behaviour be triggered by the fact the PersistenceContext in the SFSB is EXTENDED ?