[jboss-user] [JBoss Seam] - @In-jection fails on randomly applicaion scoped components w

gothmog do-not-reply at jboss.com
Thu Aug 30 05:26:44 EDT 2007


Hi,

I have two seam application scoped components, one holds an internal list which is added to by the other. So..


  | @Name("entryGate")
  | @Scope(ScopeType.APPLICATION)
  | public class EXAccessPoint {
  | 
  | 	@Logger Log log;
  | 	@In EntityManager em;
  | 	List<EntryExit> exs = new ArrayList<EntryExit>();
  | ...
  | 	public void add(String pid, Date time, boolean isExit) {
  | 		log.info("add():pid=" + pid + ";time=" + time + ";em=" + em);
  | 		EntryExit ex = null;
  | ...
  | 		exs.add(0, ex);
  | 	}
  | 

and the other uses this component (via @In) to add to the list		


  | @Name("entrySimulation")
  | @Scope(ScopeType.APPLICATION)
  | public class EXSimulation {
  | 
  | 	@Logger Log log;
  | 	@In(create=true) EXAccessPoint entryGate;
  | ...
  | 	public void simulate() {
  | ...
  | 		entryGate.addEntry("PID" + (int)((Math.random() * 5) + 1), current.getTime());
  | 	}
  | 
  | 

Now here comes the tricky bit. Two web pages are operating using <a:poll>. the first polls EXSimulation every ten seconds to simulate another series of additions to the list held by EXAccessPoint. The other polls every 1 sec to read the contents of the list from EXAccessPoint and renders them to the UI. What I'm trying to do is simulate people arriving at an EXAccessPoint and have the UI in 'near' real time display them in a security booth (hence all the Ajax)

In this scenario, every so often (but predictable) em is NOT @In-jected into EXAccessPoint when EXAccessPoint is itself injected into EXSimulation. I get a NullPointerException and my logs show:


  | 20:53:16,533 INFO  [EXAccessPoint] add():pid=PID1;time=Thu Aug 30 20:53:25 NZST 2007;em=org.jboss.seam.persistence.EntityManagerProxy at 9fa638
  | 20:53:16,533 INFO  [EXAccessPoint] add():pid=PID1;time=Thu Aug 30 20:53:20 NZST 2007;em=org.jboss.seam.persistence.EntityManagerProxy at 9fa638
  | ...
  | 20:53:17,023 INFO  [EXAccessPoint] add():pid=PID5;time=Thu Aug 30 20:53:26 NZST 2007;em=org.jboss.seam.persistence.EntityManagerProxy at 9fa638
  | ...
  | 20:53:39,749 INFO  [EXAccessPoint] add():pid=PID2;time=Thu Aug 30 20:53:46 NZST 2007;em=null
  | 20:53:39,751 FATAL [application] /cgsimulateentry.xhtml @61,102 action="#{entrySimulation.simulate}": java.lang.NullPointerException
  | 

There is concurrency and @In-jection going on here with an application scoped component, this is probably not the right design as the two threads are potentially @In-jecting a different em proxy and changing the reference to the em while the other thread is midway through using the component. 

What is the design pattern that should be used here to avoid the changing of an @In-jected em on an application scoped component across multiple threads?

Thanks

Troy 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4079500#4079500

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4079500



More information about the jboss-user mailing list