Hallo Forum,
ich fuhrwerke zur Zeit mit SFSBs herum und irgendwie klappt das nicht so ganz.
Hintergrund: Eine ehemalige SE-Anwendung soll per Webservice ansprechbar sein. Dazu habe ich Teile in EJBs umgewandelt. Da ich nun auf eine Klasse gestoßen bin, die über mehrere Methoden hinweg einen Zustand behalten muss (das DAO; ist zwar ziemlich bescheiden, aber das zustandslos zu machen, wäre ein ziemlich großer Aufwand), reicht hier die oft verwendete Stateless SessionBean nicht aus. Grob gesehen sieht das so aus:
Die Methode [c]finish()[/c] ist dabei eine mit [c]@Remove[/c] annotierte Methode. Die Methode [c]doStuff()[/c] wird von einem Webservice aufgerufen - insofern ist das mit der SFSB ziemlich doof, weil ich ja keine Zustand über mehrere Requests von außen will, sondern innerhalb eines Requests. Wenn es dafür schönere Lösungen gibt, dann interessiere ich mich natürlich auch dafür. Es wäre zwecks DI schön, wenn die Bean halt eine bleiben könnte. Das sieht etwa so aus:
Das eigentliche Problem: Diese Sache klappt etwa 50/50. Z. B. kann ich mal vier Anfragen parallel an den Service stellen und alles geht. Beim nächsten Mal schlagen die gleichen Anfragen fehl. Oder manchmal auch nur die Hälfte. Der Fehler ist dabei immer:
Die Fehlermeldung gibt zwar einige Treffer bei Google, aber zu einer Lösung hat mir das bisher noch nicht verholfen. Vielleicht hat ja jemand eine Idee.
Gruß
mK
ich fuhrwerke zur Zeit mit SFSBs herum und irgendwie klappt das nicht so ganz.
Hintergrund: Eine ehemalige SE-Anwendung soll per Webservice ansprechbar sein. Dazu habe ich Teile in EJBs umgewandelt. Da ich nun auf eine Klasse gestoßen bin, die über mehrere Methoden hinweg einen Zustand behalten muss (das DAO; ist zwar ziemlich bescheiden, aber das zustandslos zu machen, wäre ein ziemlich großer Aufwand), reicht hier die oft verwendete Stateless SessionBean nicht aus. Grob gesehen sieht das so aus:
Java:
@Stateless
public class MyBeanImpl implements MyBean {
@EJB
private MyDao dao;
public Result doStuff(Stuff stuff) {
try {
dao.setUpStuff(stuff);
Result result = new Result();
/* mehr komplexes Zeugs mit dem DAO und Aufbau des Result-Objekts */
return result;
} finally {
dao.finish();
}
}
}
Java:
@WebService
public class MyWebServiceImpl implements MyWebService {
@EJB
private MyBean myBean;
public Result doStuff(Stuff stuff) {
return myBean.doStuff(stuff);
}
}
Das eigentliche Problem: Diese Sache klappt etwa 50/50. Z. B. kann ich mal vier Anfragen parallel an den Service stellen und alles geht. Beim nächsten Mal schlagen die gleichen Anfragen fehl. Oder manchmal auch nur die Hälfte. Der Fehler ist dabei immer:
Code:
Caused by: javax.ejb.NoSuchEJBException
at com.sun.ejb.containers.BaseContainer.mapBusinessInterfaceException(BaseContainer.java:1522)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1430)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1325)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:205)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:83)
at $Proxy215.close(Unknown Source)
...
Caused by: javax.ejb.NoSuchObjectLocalException: The EJB does not exist. session-key: 1907f0100001f-ffffffffaacf51e3-9
at com.sun.ejb.containers.StatefulSessionContainer._getContext(StatefulSessionContainer.java:1220)
at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:1709)
at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1238)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:195)
... 86 more
Die Fehlermeldung gibt zwar einige Treffer bei Google, aber zu einer Lösung hat mir das bisher noch nicht verholfen. Vielleicht hat ja jemand eine Idee.
Gruß
mK