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@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@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@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#...
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&a...