问一下“精通EJB3.0”这本书的一个代码问题
bean代码如下CountBean.javapackage examples.session.stateful;import javax.ejb.Remote;import javax.ejb.Remove;import javax.ejb.Stateful;import javax.interceptor.Interceptors;/** * 有状态会话Bean * * 展示了如何开发有状态会话Bean组件的基本知识 * * Bean实例会维护一整数,存在相应的业务方法来逐增它 * * 下面给出的Annotation声明: * <ul> * <li>这是一个有状态会话Bean组件 * <li>定义的远程业务接口是 <code>Count</code> * <li><code>CountCallbacks</code>类负责生命周期回调 * </ul> */@Stateful@Remote(Count.class)@Interceptors(CountCallbacks.class)public class CountBean implements Count { /** 当前计数器,维护的会话状态 */ private int val; /** * count()业务方法 */ public int count() { System.out.println("count()"); return ++val; } /** * set()业务方法 */ public void set(int val) { this.val = val; System.out.println("set()"); } /** * 使用了@Remove注释 * * 因此在执行完这个方法后,EJB容器会销毁当前Bean实例 */ @Remove public void remove() { System.out.println("remove()"); }}
下面是客户端代码public class CountClient { public static final int noOfClients = 3; public static void main(String[] args) { try { /* 引用到初始化上下文 */ Context ctx = new InitialContext(System.getProperties()); /* 持有Count EJB组件实例的数组 */ Count count[] = new Count[noOfClients]; int countVal = 0; /* 创建数组中的各个成员,并调用各自的count()业务方法*/ System.out.println("Instantiating beans..."); for (int i = 0; i < noOfClients; i++) { count[i] = (Count) ctx.lookup(Count.class.getName()); /* 初始化Bean实例中的计数器 */ count[i].set(countVal); /* 加1,并打印结果到屏幕上 */ countVal = count[i].count(); System.out.println(countVal); /* 睡眠 */ Thread.sleep(100); } /* * 为了证实挂起和激活操作是否被EJB容器正确处理 * 调用了Bean实例的count()方法 */ System.out.println("Calling count() on beans..."); for (int i = 0; i < noOfClients; i++) { /* 加1,并打印结果到屏幕上 */ countVal = count[i].count(); System.out.println(countVal); /* 调用remove()方法,让EJB容器销毁当前Bean实例 */ count[i].remove(); /* 睡眠 */ Thread.sleep(50); } } catch (Exception e) { e.printStackTrace(); } } }
输出结果为
Instantiating beans...123Calling count() on beans...234这里为什么 Calling count() on beans...后的输出为2,3,4.我认为应该是1,2,3的
bean代码如下CountBean.javapackage examples.session.stateful;import javax.ejb.Remote;import javax.ejb.Remove;import javax.ejb.Stateful;import javax.interceptor.Interceptors;/** * 有状态会话Bean * * 展示了如何开发有状态会话Bean组件的基本知识 * * Bean实例会维护一整数,存在相应的业务方法来逐增它 * * 下面给出的Annotation声明: * <ul> * <li>这是一个有状态会话Bean组件 * <li>定义的远程业务接口是 <code>Count</code> * <li><code>CountCallbacks</code>类负责生命周期回调 * </ul> */@Stateful@Remote(Count.class)@Interceptors(CountCallbacks.class)public class CountBean implements Count { /** 当前计数器,维护的会话状态 */ private int val; /** * count()业务方法 */ public int count() { System.out.println("count()"); return ++val; } /** * set()业务方法 */ public void set(int val) { this.val = val; System.out.println("set()"); } /** * 使用了@Remove注释 * * 因此在执行完这个方法后,EJB容器会销毁当前Bean实例 */ @Remove public void remove() { System.out.println("remove()"); }}
下面是客户端代码public class CountClient { public static final int noOfClients = 3; public static void main(String[] args) { try { /* 引用到初始化上下文 */ Context ctx = new InitialContext(System.getProperties()); /* 持有Count EJB组件实例的数组 */ Count count[] = new Count[noOfClients]; int countVal = 0; /* 创建数组中的各个成员,并调用各自的count()业务方法*/ System.out.println("Instantiating beans..."); for (int i = 0; i < noOfClients; i++) { count[i] = (Count) ctx.lookup(Count.class.getName()); /* 初始化Bean实例中的计数器 */ count[i].set(countVal); /* 加1,并打印结果到屏幕上 */ countVal = count[i].count(); System.out.println(countVal); /* 睡眠 */ Thread.sleep(100); } /* * 为了证实挂起和激活操作是否被EJB容器正确处理 * 调用了Bean实例的count()方法 */ System.out.println("Calling count() on beans..."); for (int i = 0; i < noOfClients; i++) { /* 加1,并打印结果到屏幕上 */ countVal = count[i].count(); System.out.println(countVal); /* 调用remove()方法,让EJB容器销毁当前Bean实例 */ count[i].remove(); /* 睡眠 */ Thread.sleep(50); } } catch (Exception e) { e.printStackTrace(); } } }
输出结果为
Instantiating beans...123Calling count() on beans...234这里为什么 Calling count() on beans...后的输出为2,3,4.我认为应该是1,2,3的
count[]={1,2,3}count()方法是自加1,当然是{2,3,4}
System.out.println("Instantiating beans..."); for (int i = 0; i < noOfClients; i++) { count[i] = (Count) ctx.lookup(Count.class.getName()); /* 初始化Bean实例中的计数器 */ count[i].set(countVal); /* 加1,并打印结果到屏幕上 */ countVal = count[i].count(); System.out.println(countVal); /* 睡眠 */ Thread.sleep(100); }