ejb @PostConstruct na glassfishu nie chodzi

0

Witam,

chce uruchomic timer ejb na serwerze poprzez jego wlaczeniu w metodzie oznaczonej @PostConstruct. Jednak, gdy probuje wywolac jakas metode z klasy zawierajacej metode oznaczona @PostConstruct dostaje bledy w stylu:

javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.RemoteException: nested exception is: javax.ejb.EJBException: nested exception is: javax.ejb.CreateException: Could not create stateless EJB; nested exception is: 
	javax.ejb.EJBException: nested exception is: javax.ejb.CreateException: Could not create stateless EJB

co mozna z tym zrobic?

0

Przeczytac specyfikacje. Strona 88, tabela 2, wiersz 3 okresla metody jakie moga byc wywolane w metodach @PostConstruct. Zwiazane z Timerami jest tylko EJBContext.getTimerService(), natomiast metody na Timer i TimerService, jak wskazuje wiersz 4, moga byc wywolane dopiero gdy bean wejdzie w stan method-ready, czyli dopiero PO @PostConstruct i PTRZED @PreDestroy.
Pozdro.

0

hm ok.

jak w takim razie uruchomic timer wprost z serwera. Probowalem ejbCreate ale nie chodzi, sa jakies inne sposoby?
Mozna timer uruchomic z klienta ejb no ale nie o to mi chodzi.

0

Tez mi sie zaczelo nad tym zastanawiac, i doszedlem do takiego wniosku - beany sesyjne reaguja na akcje klienta, wiec nie powinny same z siebie nic robic, wiec timer mozna tylko stworzyc w wyniku jakiejs akcji klienta. I tyle w sumie.
Co do ejbCreate, to to jest uzywane dla ejb2.1 entity beans - w tej metodzie mozna stworzyc timera i wtedy kazda instancja takiej encji ma swoj timer. Beansy sesyjne i MDB maja timer przypisany do typu, nie dla instancji. Dlatego np jesli czas wywolac tmer kontener moze wywolac go na dowolnej instancji z poola .

0

no tak tylko ze kolko sie zamyka. Mowisz ze akcja klienta powinna wlaczac timer. OK!
Ale, w moim przypadku chcialem tak zrobic, tyle ze wtedy musze przechowywac czy to id czy login klienta na serwerze (podejscie1 - osobny timer dla kazdego klienta)
z tego co zrozumialem w beanach stateless niezbyt to sie daje zrealizowac. Dalem niby zmienna statyczna, tyle ze korzystam z load balancingu RMI IIOP czyli ustawiam endpoint...Z tego co rozumiem bledy wynikaja z tego iz przy upadki jednego z endpointow glassfish nie umie przekazac stanu timera do innego punktu koncowego. (tak ja to rozumiem..zapewne nie dobrze:P)

Wiec wymyslilem sobie (podejscie2), ze bedzie 1 timer sprawdzajacy wszystkich zalogowanych uzytkownikow czy sa nadal aktywni (i tego wlasnie nie umiem zrobic). Nie wiem jak zrealizowac wlaczanie takiego timera z aplikacji klienta zeby nie narobilo mi sie tyle timerow ilu klientow.

Ogolnie timer z podejscia1 chodzil poki nie zaczalem bawic sie w load balancing. Krolem ejb nie jestem, dopiero zaczalem sie tym bawic, bo jakos zawsze beany mnie odstraszaly ; p (moze czytalem specyfikacje 2.1 i dlatego? )

0

W specyfikacji jest napisane ze nie wolno uzywac zmiennych statycznych do ktorych mozna zapisywac, mozna tylko static final, a to dokladnie z takich powodow jak podales - wiele JVM ma te same klasy, i moga miec rozne wartosci te pola.
Napisz dokladniej co chcesz zrobic, to ktos bedzie w stanie pomoc.

0

ok

Potrzebuje cos w stylu watku ktory co okreslony czas bedzie mi wykonywal sprawdzenie kiedy klient wyslal ostatni sygnal ze jest zalogowany i jestli ten czas przekracza powiedzmy 7 minut to w bazie zaznaczam ze wylogowany. Z tego co czytalem

Wiec mam komponent ejb na glassfishu ktory deplojuje do klastra, w tym momencie sa 3 instancje. Chce rownoczesnie korzystac z load balancingu miedzy tymi instancjami, wiec ustawiam endpointy na instancje. Wszystko to smiga doskonale dopoki nie uzywam timerow.

Przy wywolaniu jakiejs metody z klasy zawierajacej timer przez ejb klienta dostaje errory ze nie mozna stworzyc beana. Timer ten chodzi bez problemu gdy nie ustawiam endpointow. Wnioskuje wiec ze jest jakis problem z uzyciem load balancingu w polaczeniu z uzywaniem timerow. Tylko jaki?

0

Jeśli używasz linuxa i chcesz co 7 min wykonać jakąś akcje skorzystaj z crona:
ustaw mu skrypt w sh np dla jboss:
#!/bin/bash

cd readlink -f $0 | xargs dirname
cd ../../

java -classpath .:include/:include/jboss-client/ path do zwykłej klasy z main

i tam możesz korzystać z entity managera itd

0

Daj sobie spokój z TimerService i użyj quartza:
http://www.quartz-scheduler.org/

1 użytkowników online, w tym zalogowanych: 0, gości: 1