 |
AppletTalk.com Java discussions newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
M.A.Bednarz Guest
|
Posted: Mon Apr 09, 2007 2:52 am Post subject: EJB3: Usertransaktion gekoppelt an @PostConstruct Methode st |
|
|
Hi,
ich möchte eine Usertransaction in einem EJB3 Stateful Session Bean starten.
Mein Service sieht wie folgt aus:
@Stateful(name = "TestService")
@Remote(TestService.class)
@Local(TestService.class)
@TransactionManagement(TransactionManagementType.BEAN)
@Interceptors ({TransactionInterceptor.class})
public class TestServiceImpl implements TestService {
....
@Resource UserTransaction userTransaction;
@PostConstruct
public void postConstruct() {
try {
userTransaction.begin();
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
....
}
Ich bekomme jedoch in JBOSS 4.2 beim Remote Zugriff die Fehlermeldung, dass
ich an dieser Stelle keine Transaktion starten kann. In allen anderen
Businessmethoden des Beans geht es jedoch problemlos. Kann mir jemand ggf.
einen Tipp geben, wie ich gekoppelt an @PostConstruct automatisch eine
NutzerTransaktion starten kann?
Danke,
Andreas |
|
| Back to top |
|
 |
M.A.Bednarz Guest
|
Posted: Tue Apr 10, 2007 9:38 pm Post subject: Re: EJB3: Usertransaktion gekoppelt an @PostConstruct Method |
|
|
Halo Ralf,
mittlerweile sehe ich die Tautologie meines Ansatzes und begnüge
mich mit reinen CMTs.
Andreas
"Ralf Rapude" <rapude (AT) web (DOT) de> schrieb im Newsbeitrag
news:evfjpn$ep0$1 (AT) online (DOT) de...
| Quote: | Servus,
ich kanns auch nur vermuten, denke aber, nachdem ich nochmal genau in die
Api geguckt habe, dass zwar die DI komplett durchgelaufen ist, dein Objekt
aber noch nicht vollständig initialisiert wurde, wenn postConstruct()
aufgerufen wird.
Abgesehen davon finde ich das Vorgehen an sich etwas zweifelhaft, weil es
für mich aus aussieht, als wäre das, was du da über die Annotation anlegen
willst, eigentlich eher sowas wie ein Sessionobjekt. An dieser Stelle,
bevor überhaupt irgendeine Businessmethode aufgerufen wurde, die den
Beginn einer Transaktion nötig macht, schon per Default eine zu starten,
find ich sehr schwierig, weil das sehr viel zusätzlicher Overhead ist, der
initialisiert und verwaltet werden muß. Wenns wirklich nicht möglich ist,
die Transaktionsverwaltung den Defaults zu überlassen, würde ich das
vermutlich eher in dem Moment über ein REQUIRES_NEW anleiern, in dem es
wirklich notwendig wird.
BTW:
Mußt du Stateful arbeiten?
Grüße u. schönen Tag
Ralf
|
|
|
| Back to top |
|
 |
Steffen Ramlow Guest
|
Posted: Tue Apr 10, 2007 11:45 pm Post subject: Re: EJB3: Usertransaktion gekoppelt an @PostConstruct Method |
|
|
Ralf Rapude wrote:
| Quote: | Servus,
ich kanns auch nur vermuten, denke aber, nachdem ich nochmal genau in
die Api geguckt habe, dass zwar die DI komplett durchgelaufen ist,
dein Objekt aber noch nicht vollständig initialisiert wurde, wenn
postConstruct() aufgerufen wird.
|
Das sollte laut Spec. aber klappen.
Diverse Sun-Tutorials nutzen das auch genauso.
| Quote: | Abgesehen davon finde ich das Vorgehen an sich etwas zweifelhaft, weil
es für mich aus aussieht, als wäre das, was du da über die Annotation
anlegen willst, eigentlich eher sowas wie ein Sessionobjekt.
|
Eine Tx über die ganze Session halten?
| Quote: | An dieser Stelle, bevor überhaupt irgendeine Businessmethode aufgerufen
wurde,
die den Beginn einer Transaktion nötig macht, schon per Default eine
zu starten, find ich sehr schwierig, weil das sehr viel zusätzlicher
Overhead ist, der initialisiert und verwaltet werden muß.
|
Nicht wirklich, wenn man davon ausgeht, dass jede BM auch eine Tx benötigt.
Wenn das der Container für dich macht, laufen da auch erst Interceptors ab.
--
Alle gegen Alle
http://www.fightclub-berlin.de |
|
| Back to top |
|
 |
Steffen Ramlow Guest
|
Posted: Tue Apr 10, 2007 11:47 pm Post subject: Re: EJB3: Usertransaktion gekoppelt an @PostConstruct Method |
|
|
M.A.Bednarz wrote:
| Quote: | Halo Ralf,
mittlerweile sehe ich die Tautologie meines Ansatzes und begnüge
mich mit reinen CMTs.
|
Wieso doppelt gemoppelt, du hattest den Tx-Managementtyp doch auf BEAN. |
|
| Back to top |
|
 |
M.A.Bednarz Guest
|
Posted: Tue Apr 10, 2007 11:59 pm Post subject: Re: EJB3: Usertransaktion gekoppelt an @PostConstruct Method |
|
|
Doppeltgemoppelt deswegen,
weil ich usertransactions nach kurzer Überlegung an dieser Stelle nicht
benötigt habe:-)) Mit den Specs hast Du Recht, da habe ich ein paar Minuten
auch gegrübelt. Sun liefert auch ein Beispiel, welches das macht. Allerdings
scheint es dort keiner getestet zu haben,
da der Quellcode beim reinen Abtippen fehlerhaft ist )
Allerdings vermute ich, dass das problem JBOSS seitig ist. Ich habe es nicht
unter Glassfish getestet, wahrscheinlich läuft es dort. Interessant wäre die
Umsetzung zum Beispiel als Bestandteil eine Fameworks für nicht erfahrene
User, die einfach nur ein Stateful Session Bean mit BMT bekommen und sich
nicht um das anfängliche Setzen der Transaktion kümmern müssen.
Ich habe jetzt als Notlösung einen EJB Interceptor geschrieben, der bei
jedem Methodenaufruf das Vorhandensein einer UT prüft und diese ggf.
startet.
Grüße,
Andreas
"Steffen Ramlow" <s.ramlow (AT) gmx (DOT) net> schrieb im Newsbeitrag
news:582497F2ei5nmU1 (AT) mid (DOT) individual.net...
| Quote: | Ralf Rapude wrote:
Servus,
ich kanns auch nur vermuten, denke aber, nachdem ich nochmal genau in
die Api geguckt habe, dass zwar die DI komplett durchgelaufen ist,
dein Objekt aber noch nicht vollständig initialisiert wurde, wenn
postConstruct() aufgerufen wird.
Das sollte laut Spec. aber klappen.
Diverse Sun-Tutorials nutzen das auch genauso.
Abgesehen davon finde ich das Vorgehen an sich etwas zweifelhaft, weil
es für mich aus aussieht, als wäre das, was du da über die Annotation
anlegen willst, eigentlich eher sowas wie ein Sessionobjekt.
Eine Tx über die ganze Session halten?
An dieser Stelle, bevor überhaupt irgendeine Businessmethode aufgerufen
wurde,
die den Beginn einer Transaktion nötig macht, schon per Default eine
zu starten, find ich sehr schwierig, weil das sehr viel zusätzlicher
Overhead ist, der initialisiert und verwaltet werden muß.
Nicht wirklich, wenn man davon ausgeht, dass jede BM auch eine Tx
benötigt.
Wenn das der Container für dich macht, laufen da auch erst Interceptors
ab.
--
Alle gegen Alle
http://www.fightclub-berlin.de
|
|
|
| Back to top |
|
 |
Ralf Rapude Guest
|
Posted: Wed Apr 11, 2007 7:14 am Post subject: Re: EJB3: Usertransaktion gekoppelt an @PostConstruct Method |
|
|
Hallo nochmal,
| Quote: | Das sollte laut Spec. aber klappen. Diverse Sun-Tutorials nutzen das
auch genauso.
es war, wie gesagt, auch nur eine Vermutung und die Begründung, dass es |
laufen müßte, weil die Spec das sagt, finde ich kühn, weil ich erstmal
nicht davon ausgehe, dass jede Implementierung zu 100% mit der
Spezifikation konform geht. Wär zwar schön, würd mich aber wundern. In
der Api jedenfalls steht das hier:
"The PostConstruct annotation is used on a method that needs to be
executed after dependency injection is done to perform any
initialization. This method MUST be invoked before the class is put into
service."
Daraus habe ich geschlossen, dass es eine Unterscheidung gibt zwischen
der Initialisierung aller Attribute durch die DI und der vollständigen
Verfügbarkeit in der Applikation, d.h. bevor die Bean Remote oder Local
wirklich durch einen Client genutzt werden kann. Mein Verdacht war, dass
eine UserTransaction geöffnet wird, obwohl man noch ein gutes Stück
davon entfernt ist, überhaupt einen User haben zu können und dann würds
auch Sinn machen, dass es an der Stelle mit dem Aufruf knallt. Warum
denkst, du, läuft es nicht?
| Quote: | Eine Tx über die ganze Session halten?
Der Sinn will sich mir da nicht erschliessen. IMHO ist eine Transaktion |
dadurch gekennzeichnet, dass du eine atomare Abfolge von Aktionen
erreichen willst, d.h. Sinn machts meiner Ansicht nach, wenn du
Businessmethoden aufrufst, bei denen die Gefahr besteht, dass das System
in einen inkonsistenten Zustand gerät, wenn irgendwo was hakt. Aber eine
Transaktion über eine komplette Session mit sich rumschleppen, egal, ob
du die brauchst oder nicht? Wüßt ich nicht wofür das gut sein soll. Was
ist denn, wenn die SessionBean initialisiert wird, aber das Ding ewig
rumdümpelt, ohne genutzt zu werden? Dann lungert die ganze Zeit irgendwo
im Scope ein Transaktionsobjekt mit seinem ganzen Overhead rum, ohne
irgendwas zu tun. Und wenn das dann bei jeder SessionBean für jeden User
gemacht wird? Nee. Also wirklich. Speicher und Hardware kostet ja
wirklich nicht mehr die Welt, aber das empfind ich dann doch als zu
großzügigen Umgang mit Ressourcen.
| Quote: | Nicht wirklich, wenn man davon ausgeht, dass jede BM auch eine Tx
benötigt. Wenn das der Container für dich macht, laufen da auch erst
Interceptors ab.
Es bezog sich auch nicht so sehr darauf, generell mit Transaktionen zu |
geizen, sondern eher auf den obengenannten Punkt. Und zweitens denke ich
eben, dass man sich überlegen sollte, ob es wirklich notwendig ist, dass
Transaktionshandling selber in die Hand zu nehmen. Einmal, weil man
meiner Ansicht nach schnell anfängt die EJB 2.1 XML-Hölle gegen die
Annotationshölle einzutauschen und dann eben auch, weil zumindest bei
den Sachen, die ich bisher damit gebaut habe, durchaus sinnvolle
Defaulteinstellungen vorhanden waren, d.h. ich konnte mit relativ
wenigen Annotationen zuverlässig funktionierende Applikationen bauen und
die Begrenzung von Transaktionen auf Beginn und Ende einer Methode hat
bisher eigentlich immer für alles gereicht. Von daher würd ich
eigentlich soweit als möglich versuchen, dem Container die Arbeit und
die Verantwortung zu überlassen und erst wenn das wirklich nicht mehr
geht, selber Hand anlegen (z.B. verteilte Transaktionen usw.).
Grüße u. schönen Tag
Ralf |
|
| Back to top |
|
 |
Ralf Rapude Guest
|
Posted: Wed Apr 11, 2007 7:14 am Post subject: Re: EJB3: Usertransaktion gekoppelt an @PostConstruct Method |
|
|
Hallo,
| Quote: | Ich habe jetzt als Notlösung einen EJB Interceptor geschrieben, der bei
jedem Methodenaufruf das Vorhandensein einer UT prüft und diese ggf.
startet
das ist nicht notwendig. Du hast sowieso einen Transaktionsbeginn, wenn |
eine Methode aufgerufen wird und die Transaktion endet, wenn die Methode
durch ist.
Grüße u. schönen Tag
Ralf |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|