//CalculatorRemote.java package calculator; import javax.ejb.*; @Remote public interface CalculatorRemote { public int add(int x,int y); }
//CalculatorBean.java package calculator; import javax.ejb.*; @Stateless public class CalculatorBean implements CalculatorRemote { public int add(int x,int y) { System.out.println("Current ThreadName Is: "+Thread.currentThread().getName()); return (x+y); } }
<?xml version='1.0' encoding='UTF-8'?> <weblogic-ejb-jar xmlns="http://www.bea.com/ns/weblogic/10.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <weblogic-enterprise-bean> <ejb-name>CalculatorBean</ejb-name> <stateless-session-descriptor> <pool></pool> <stateless-clustering> <home-is-clusterable>false</home-is-clusterable> <stateless-bean-is-clusterable>false</stateless-bean-is-clusterable> </stateless-clustering> </stateless-session-descriptor> <transaction-descriptor></transaction-descriptor> <jndi-name>X</jndi-name> <dispatch-policy>JackWorkManager</dispatch-policy> <remote-client-timeout>0</remote-client-timeout> </weblogic-enterprise-bean> </weblogic-ejb-jar>
package calculator; import javax.naming.*; import java.util.*; public class Ejb3Client { public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory"; private static String serverUrl ="t3://localhost:7001"; public static void main(String[] ar) throws Exception { for(int i=0;i<=5000;i++) { InitialContext ic=null; try{ Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); env.put(Context.PROVIDER_URL, serverUrl); ic = new InitialContext(env); } catch(Exception e) { System.out.println("nt Didnot get InitialContext: "+e); } try { Object obj=ic.lookup("calc#calculator.CalculatorRemote"); CalculatorRemote remote=(CalculatorRemote)obj; System.out.println("nntRemote=>"+remote.getClass()); System.out.println("nntClassLoading=>1"); Class.forName("calculator.CalculatorRemote"); System.out.println("nntClassLoading=>2"); System.out.println("nnt SUM = "+remote.add(Integer.parseInt(ar[0]),Integer.parseInt(ar[1]))); } catch(Exception e) { System.out.println("nnt jack Exception => "+e); e.printStackTrace(); } System.out.println("nt Iteration ------------ "+i); } } }
In the output (STDOUT) of the Server you will see that there are only 2 Threads which are processing all the 5000 Clients request…..
Current ThreadName Is: [ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)' Current ThreadName Is: [ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)' Current ThreadName Is: [ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)' Current ThreadName Is: [ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)' Current ThreadName Is: [ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)' Current ThreadName Is: [ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)' Current ThreadName Is: [ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' Current ThreadName Is: [ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' Current ThreadName Is: [ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' Current ThreadName Is: [ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' Current ThreadName Is: [ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'