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:
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:
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:
Nu kan du komma åt alla metoder som exponeras i MessageDrivenContext via medlemmen "context".
public void setMessageDrivenContext(MessageDrivenContext ctx){
// Save the context
this.context = ctx;
}
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().
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:
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:
Följande regler gäller för transaktioner:
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.");
}
}