I'm following this tutorial which also uses an EJB:
package exercise1;
import java.util.Random;
import javax.ejb.Stateless;
import javax.inject.Named;
@Stateless
public class MessageServerBean {
private int counter = 0;
public String getMessage(){
Random random = new Random();
random.nextInt(9999999);
int myRandomNumber = random.nextInt();
return "" + myRandomNumber;
}
public int getCounter(){
return counter++;
}
}
Here is an output example:
Hello from Facelets
Message is: 84804258
Counter is: 26
Message Server Bean is: exercise1.MessageServerBean@757b6193
Here's my observation:
@Stateless
I always get the same object ID and counter always increments. @Stateful
I get a new instance every time I refresh the page.@Singleton
I get the same results as when I set it to @Stateless
: same object ID, counter incrementing. So, what I actually would like to understand is: what's the difference between @Stateless
and @Singleton
EJBs in this very case?
You're seeing the same output because there is only one client accessing the EJB at a time. The application server is able to recycle the same stateless EJB object for each call. If you try a concurrent access – multiple clients at the same time - you'll see new stateless instances appearing.
Note that, depending on the server load, even two consecutive method invocations made by the same client may end up in different stateless EJB objects!
For a singleton EJB, there will no difference – there is always only one instance per application, no matter how many clients try to access it.