Stack Overflow using EJB3
iwadasn Jul 18, 2005 10:52 AMI get a stack overflow while passivating my Stateful bean....
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]
Here is the actual code in question.....
/*
* 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;
}
}
As you can see, it's based on your example code. ;-)