Hello,
I have a couple of questions related to the number of stateless beans created by JBoss. First please take a look at the following code:
@Remote
public interface ComputerRemote {
void startComputations();
}
@Stateful
public class ComputerBean implements ComputerRemote {
@EJB
private ProcessorLocal processor;
public void startComputations() {
Random r = new Random();
while(true) {
processor.compute(r.nextInt());
}
}
}
@Local
public interface ProcessorLocal {
void compute(int i);
}
@Stateless
public class ProcessorBean implements ProcessorLocal {
private static int COUNTER = 0;
public ProcessorBean() {
COUNTER ++;
}
public void compute(int i) {
System.out.println("----------------> " + COUNTER);
// some dummy computations - it's here only in order to take some time
double d = 0.3;
for (int j=0; j<100; j++) {
d+= 0.2 % 4 + i;
}
}
}
So, we got stateful ComputerBean (along with its remote interface) which holds a reference to (local) stateless ProcessorBean.
ComputerBean draws some random number and passes it into processor which do some dummy computations (just to take some time).
There is also a COUNTER integer which is expected to count the number of stateless ProcessorBeans.
If I execute it as below:
Object obj = jndiContext.lookup("app/ComputerBean/remote");
ComputerRemote computer = (ComputerRemote) obj;
computer.startComputations();
Computations are started, but on JBoss console there is still printed COUNTER=1.
So my questions are:
1. Why COUNTER is equal 1 all the time? Shouldn't it be more stateless beans? (I know that server manages them, but I thought that if stateless bean do some work for a some amount of time, and another call comes in, then server would create another instance of thise bean and processing both of them would take place simultaneously).
2. Is COUNTER=1 all the time because ComputerBean waits for ProcessorBean to end its current computations, and then call another one passing the next random number? I mean - it is blocking operation, running in one thread? Is there any way to run this computations in multiple threads and do not wait for the end of the first one in order to call second?
3. (this question is probably related to 2nd question) Is there any way to run ComputerBean in a "daemon" mode? I mean, if I execute computer.starComputations() by JNDI from the remote client it stops and waits for the return from startComputations method. It would never happen, because it runs in while(true) loop. But I'd like to call this method and process next client's instructions. E.g. ProcessorBean was a kind of CRON service / FTP server (running in background all the time, waiting for incoming requests, not blocking the rest of execution).
Thanks in advance for all hints!
Piotr