Avatar billede svarrer Nybegynder
21. oktober 2005 - 10:31 Der er 13 kommentarer og
1 løsning

Init i en servlet..

Hejsa.. ;-)

Jeg har et spørgsmål angående init-metoden i en java servlet.
de ting der bliver oprettet i init-metoden skal specifikt nedlægges igen i destroy-metoden ?! korrekt?..
hvordan gælder det med singletons og connectionpools der bliver initialiseret? og tråde der bliver sat igang.. skal disse også specifikt nedlægges?!..
Det hele bliver kørt i en startupServlet, som bliver kørt on-load (eneste henvisning = deploy descripteren)
så hvornår bliver destroy-metoden kaldt på en sådan servlet der ikke umiddelbart har nogen referencer?!
//-----------------
tillægs spørgsmål:
ved initialisering af singletons uden brug af referencer hvad så?! hvornår finder jvm ud af hvornår de skal garbage collectes?..
altså i koden =
singleton.getInstance(); <-- uden at gemme den reference der bliver oprettet..ala = Singleton st = singleton.getinstance();
ideen er at hver singleton loader en masse data, der skal være klar til brug når programmet kører.

på forhånd tak

Christian
Avatar billede arne_v Ekspert
21. oktober 2005 - 10:40 #1
principielt skal destroy nedlægge alt det der er oprettet i init

men for en normal servlet (ikke SingleThreadModel) kaldes destroy når web
applikationen lukkes ned og så er det måske ikke så vigtigt igen - men pænt at gøre

jeg formoder at den husker sine startup servlets !

JVM GC'er alt som ikke kan refereres og da noget static altid kan refereres så
bliver den aldrig GC'et
Avatar billede svarrer Nybegynder
21. oktober 2005 - 10:48 #2
dvs at singletons'sene ikke bliver GC'et?.
og når nu jeg ikke har en lokal reference, skal man så lave en static close()/destroy() metode på dem?

og hvordan med trådene?!.. der bliver sat to tråde igang i init{}metoden, som ikke har nogle referncer andre steder, og disse to bliver kun sat igang, aldrig stoppet.. hvor lang tid vil de blive ved?!?'¨
burde man ikke kalde en tråd.destroy()...

på forhånd tak.. og super hurtigt svar..
Christian
Avatar billede arne_v Ekspert
21. oktober 2005 - 11:09 #3
korrekt - fordi de er per definition altid available for brug

Du kan lave en close og bruge MinSingleton.getInstance().close()

Hvis du starter 2 tråde i en startup servlet init metode så bør du gemme referencer
til dem og stopp dem i destroy metode.

Iøvrigt hvis du kunne undgå selv at starte tråde ville det være det pæneste.
Servlet containere er ligeosm ikke beregnet til den slags.
Avatar billede svarrer Nybegynder
21. oktober 2005 - 11:18 #4
.. er det muligt at købe en fan-plakat med dig?!?!?! ;-)

Du har nærmest reddet min weekend..  :D
.. og dette kunne muligvis betyder at jeg ikke behøver at drive rovdrift på din ekspertviden ala
http://www.eksperten.dk/spm/646355


stik mig et svar! :D :D :D og super mange tak!!!!!

Christian
Avatar billede arne_v Ekspert
21. oktober 2005 - 11:19 #5
svar
Avatar billede arne_v Ekspert
21. oktober 2005 - 11:21 #6
hvis dine tråde lytter på sockets så er den rigtige J2EE måde at skifte til
en fuld J2EE app server og bruge en JCA connector og en MDB EJB til at håndtere
requests som kommer ind på en ikke HTTP socket
Avatar billede svarrer Nybegynder
21. oktober 2005 - 11:29 #7
..øøhh.. nok ikk til mig! ;-)

btw.. en close metode i en singleton bør bare se sådan her ud ikk?

//----destroy method--
  public void close()
  {
      handler = null;  //singleton instancen
  }
vil den så blive GC'et?
Avatar billede arne_v Ekspert
21. oktober 2005 - 11:32 #8
jeg tror at jeg ville lave den

public void close()
  {
      ressourcesomsingletinbruger.close();
  }

hvis du vil helt af med singleton vil jeg lave den static

  public static void close()
  {
      instance = null;
  }

og kalde med MinSingleton.close()

og så bliver den GC'et
Avatar billede svarrer Nybegynder
21. oktober 2005 - 14:30 #9
Hej igen

.. øøh.. til min store overraskelse syntes jeg ikke rigtig at der bliver frigjort nogen ressourcer?!..
alle ressourcerne bliver loadet i en startUpServlet, der bliver loadet on-start up..

DD:
<servlet>
    <servlet-name>StartUpServlet</servlet-name>
    <init-params> en del....</init params>
    <load-on-startup>1</load-on-startup>
</servlet>

betyder dette ikke at den bliver loadet når J2EE containeren bliver loadet?.. hvornår køres servlettens destroy-metode så?? skal jo køres når en eventuel bruger enten logger af eller lukker browseren.

min startupservlet's destroy:
  //Clean up resources
  public void destroy() {
    try {
      ConnectionPools.getInstance().closeAll();
     
      //---closing treads
      mdc.destroy();
      exceededJobController.destroy();
      //---closing singletons
      ZipHandler.closeSingleton();
      WebServerParams.closeSingleton();
      ApplicationParams.closeSingleton();
      TranslationLookupHandler.closeSingleton();
      //----clean up by calling the Garbage collector---
      System.gc();
    }
nogen ideer til hvorfor der ikke umiddelbart bliver frigjort resourcer?!?!

på forhånd tak
Christian
Avatar billede arne_v Ekspert
21. oktober 2005 - 14:35 #10
init køres når web applikationen starter op d.v.s. enten ved start af servlet
container eller efter (re)deployment af web app

destroy køres når web applikationen lukkes ned d.v.s. enten når servlet
containeren lukker ned eller før redeployment af web app
Avatar billede arne_v Ekspert
21. oktober 2005 - 14:35 #11
det burde være helt overflødigt at kalde GC
Avatar billede arne_v Ekspert
21. oktober 2005 - 14:36 #12
hvis du vil have noget gjordt når folk logger på eller af så skal du have
fat på en session listener
Avatar billede svarrer Nybegynder
21. oktober 2005 - 14:44 #13
takker..endnu en gang
Avatar billede arne_v Ekspert
21. oktober 2005 - 14:46 #14
iøvrigt vil jeg normalt anbefale en container managed connection pool (forudsat
at vi snakker database connections)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester