Uploaded image for project: 'EJB 3.0'
  1. EJB 3.0
  2. EJBTHREE-231

Stack Overflow when including non-transient SessionContext

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • EJB 3.0 RC3
    • EJB 3.0 Beta 1
    • EJB3 Extensions
    • None
    • Standard java 1.5.0_04 on Linux

      When a session bean includes its context, like so....

      /*

      • Ejb3AdditionBean.java
        *
      • Created on July 15, 2005, 9:20 AM
        *
      • To change this template, choose Tools | Options and locate the template under
      • the Source Creation and Management node. Right-click the template and choose
      • Open. You can then make changes to the template in the Source Editor.
        */
        package com.hb.dataBinding.service.instrument.session;

      import javax.ejb.Remote;
      import java.util.Properties;
      import javax.ejb.Stateless;
      import javax.ejb.Stateful;
      import javax.ejb.TransactionAttribute;
      import javax.ejb.TransactionAttributeType;
      import javax.naming.InitialContext;
      import javax.persistence.EntityManager;
      import javax.persistence.EntityManagerFactory;
      import javax.persistence.PersistenceContext;
      import javax.persistence.PersistenceUnit;
      import com.hb.dataBinding.api.instrument.session.Access;
      import com.hb.dataBinding.service.instrument.entity.Ejb3InstrumentTypeImplBean;
      import javax.annotation.Resource;
      import javax.ejb.SessionContext;

      /**

      • @author tward
        */
        @Stateful
        @TransactionAttribute(TransactionAttributeType.REQUIRED)
        @Remote(Access.class)
        public class Ejb3InstrumentAccessBean implements Access, java.io.Serializable {

      @Resource
      SessionContext _context;

      @PersistenceContext(unitName="datawarehouse")
      private EntityManager manager;

      /**

      • Creates a new instance of Ejb3AdditionBean
        */
        public Ejb3InstrumentAccessBean() { }

      public static void main( String[] args ) throws Exception

      { Properties env = new Properties(); env.put( "java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory" ); env.put( "java.naming.provider.url", "https://" + args[0] + ":8443/invoker/JNDIFactory" ); env.put( "java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces" ); //env.put( "org.jboss.security.ignoreHttpsHost", "true" ); InitialContext ctx = new InitialContext( env ); Access calculator = (Access) ctx.lookup( Access.class.getName() ); System.out.println( "1 + 1 = " + calculator.add( 1, 1 ) ); //System.out.println("1 - 1 = " + calculator.subtract(1, 1)); }

      public double add( double x, double y )

      { final Ejb3InstrumentTypeImplBean bean = manager.find( Ejb3InstrumentTypeImplBean.class, new Integer( 4 ) ); System.out.println( "Got a bean: " + bean ); return x + y; } }

      A stack overflow is caused when the bean tries to passivate (apparently). Setting the SessionContext to transient (the java keyword, not the aspect) fixes the problem.

      Here is the trace...

      10:46:15,257 INFO [STDOUT] Exception in thread "Timer-7"
      10:46:15,258 INFO [STDOUT] java.lang.StackOverflowError
      10:46:15,270 INFO [STDOUT] at java.util.Hashtable.get(Hashtable.java:336)
      10:46:15,271 INFO [STDOUT] at java.util.Properties.getProperty(Properties.java:774)
      10:46:15,271 INFO [STDOUT] at org.jboss.util.property.PropertyMap.getProperty(PropertyMap.java:627)
      10:46:15,271 INFO [STDOUT] at java.lang.System.getProperty(System.java:629)
      10:46:15,271 INFO [STDOUT] at org.jboss.system.JBossRMIClassLoader.getClassAnnotation(JBossRMIClassLoader.java:105)
      10:46:15,271 INFO [STDOUT] at java.rmi.server.RMIClassLoader.getClassAnnotation(RMIClassLoader.java:364)
      10:46:15,271 INFO [STDOUT] at sun.rmi.server.MarshalOutputStream.annotateClass(MarshalOutputStream.java:75)
      10:46:15,272 INFO [STDOUT] at java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1168)
      10:46:15,272 INFO [STDOUT] at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1121)
      10:46:15,272 INFO [STDOUT] at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1278)
      10:46:15,272 INFO [STDOUT] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1073)
      10:46:15,272 INFO [STDOUT] at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:291)
      ......
      10:46:15,527 INFO [STDOUT] at org.jboss.ejb3.stateful.StatefulBeanContext.writeExternal(StatefulBeanContext.java:120)
      10:46:15,527 INFO [STDOUT] at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1304)
      10:46:15,528 INFO [STDOUT] at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1282)
      10:46:15,528 INFO [STDOUT] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1073)
      10:46:15,528 INFO [STDOUT] at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1369)
      10:46:15,528 INFO [STDOUT] at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1341)
      10:46:15,528 INFO [STDOUT] at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1284)
      10:46:15,528 INFO [STDOUT] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1073)
      10:46:15,529 INFO [STDOUT] at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:291)
      10:46:15,529 INFO [STDOUT] at java.rmi.MarshalledObject.(MarshalledObject.java:92)
      10:46:15,529 INFO [STDOUT] at org.jboss.ejb3.stateful.StatefulBeanContext.writeExternal(StatefulBeanContext.java:120)
      10:46:15,529 INFO [STDOUT] at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1304)
      10:46:15,529 INFO [STDOUT] at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1282)
      10:46:15,530 INFO [STDOUT] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1073)
      10:46:15,530 INFO [STDOUT] at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1369)
      10:46:15,530 INFO [STDOUT] at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1341)
      10:46:15,530 INFO [STDOUT] at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1284)
      10:46:15,530 INFO [STDOUT] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1073)
      10:46:15,530 INFO [STDOUT] at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:291)
      10:46:15,531 INFO [STDOUT] at java.rmi.MarshalledObject.(MarshalledObject.java:92)
      10:46:15,531 INFO [STDOUT] at org.jboss.ejb3.stateful.StatefulBeanContext.writeExternal(StatefulBeanContext.java:120)
      10:46:15,531 INFO [STDOUT] at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1304)
      3169.290: [Full GC 3169.290: [CMS3170.268: [CMS-concurrent-mark: 0.978/60.972 secs]

              patriot1burke@gmail.com Bill Burke (Inactive)
              iwadasn iwadasn (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

                Created:
                Updated:
                Resolved: