programmera.net -> ejb -> normal     för utskrift      info@programmera.net

Livscykeln för en meddelandedriven böna

1. Livscykel
2. Hur skapas en instans?
3. setMessageDrivenContext()
4. ejbCreate()
5. ejbRemove()
6. onMessage()

1. Livscykel

På denna sida går vi igenom bönans olika tillstånd och de "callback"-metoder som behållaren aropar på instansen då instansen går från ett tillstånd till ett annat. En meddelandedriven böna har en ganska enkel livscykel som liknar livscykeln för en tillståndslös sessionsböna. Bilden nedan visar hur en meddelande driven böna med CMT (och som kräver en transaktion) fungerar:



De olika tillstånden beskrivs nedan:

  1. DOES NOT EXIST: Detta tillstånd betyder att instansen inte existerar.
  2. METHOD READY: I detta tillstånd kan instansen ta emot meddelanden med hjälp av "onMethod()". Om behållaren anropar "onMethod()" så kan detta föra instansen till tillståndet METHOD READY IN TRANSACTION beroende på dina inställningar i "ejb-jar.xml". Om bönan är av typen CMT sköts detta automatiskt av behållaren.
  3. METHOD READY IN TRANSACTION: Detta tillstånd innebär att instansen befinner sig mitt i ett metodanrop. För meddelandedrivna bönor måste transaktionen alltid avsluta i samband med att metoden kört klart. Om metoden kastar ett "System Exception" kommer instansen att gå direkt till DOES NOT EXIST och således hoppa över "ejbRemove()" som normalt sett anropas innan instansen upphör att existera.

2. Hur skapas en instans?

Då servern startas skapar behållaren själv upp ett antal instanser av den meddelandedrivna bönan och placerar dessa i en pool. Servern bestämmer själv hur många instanser som ska vara i poolen. När behållaren tycker att fler instanser behövs kommer fler att skapas upp. När en meddelandedriven böna instansieras sker följande:

  1. newInstance() En ny instans skapas genom att newInstance() anropas på den meddelandedrivna bönan.
  2. setMessageDrivenContext() anropas på den nya instansen.
  3. ejbCreate() anropas på den nya instansen.

3. setMessageDrivenContext()

Anropas av behållaren i samband med att bönan initieras. I denna metod ska du se till att instansen lagrar MessageDrivenContext någonstans, vanligtvis i en medlemsvariabel:
public void setMessageDrivenContext(MessageDrivenContext ctx){
	// Save the context	
	this.context = ctx;
}	
Nu kan du komma åt alla metoder som exponeras i MessageDrivenContext via medlemmen "context".

4. ejbCreate()

Anropas av behållaren i samband med att bönan initieras. Om du gör initieringar i denna metod kommer de bara exekveras en gång under instansens livstid, detta kan vara mer effektivt än att lägga initieringarna i onMessage().

  • OBS: ejbCreate() har ingen motsvarighet i något Home-gränssnitt eftersom en meddelandedriven böna inte har något Home-gränssnitt.

5. ejbRemove()

Behållaren har rätt att minska antalet instanser i poolen (något jag tror i praktiken sällan sker på en server som har gott om minne). ejbRemove() anropas av behållaren precis innan instansen förstörs. I följande fall kan en instans förstöras utan att ejbRemove() kommer att anropas:

  1. Instansen kastar ett "System Exception", vilket resulterar i att instansen omedelbart tas bort ur poolen.
  2. Behållaren kraschar.

6. onMessage()

Den enda verksamhetsmetoden som en meddelandedriven böna har är onMessage(). När ett meddelande anländer väljer behållaren ut en instans ur poolen och anropar onMessage() på denna instanse med meddelandet som argument. I denna metod tolkas och hanteras meddelandet. Observera följande regler för undantag:

  • onMessage() får inte deklareras att kasta några undantag eftersom kommunikationen med klienten är asynkron för en meddelandedriven böna.
  • Om ett RuntimeException (ej deklarerat undantag) kastas i onMessage() kommer behållaren återlämna meddelandet till kön och radera instansen ur poolen.
Följande regler gäller för transaktioner:
  • onMessage() måste starta en egen transaktion om någon transaktion ska kunna användas. De enda tillåtna transaktionsattributen (i ejb-jar.jar) är NotSupported och Required.
  • Om en BMT-transaktion påbörjas i onMessage() måste den avslutas innan metoden avslutas.
  • Vid rollback kommer behållaren återlämna meddelandet till kön.
Exempel: Vi implementerar onMessage() där vi skriver ut meddelandet till debug:
public void onMessage(Message msg){
	// Log the call
	System.out.printl("onMethod() called on instance id=" + this.id);
	
	// Print the text to debug
	if( msg instance of TextMessage){
		System.out.printl("Message is =" + msg);
	}else{
		System.out.printl("Not a TextMessage.");
	}
}