问一下“精通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的

解决方案 »

  1.   

    有状态会话bean在第一次结束时count[]={1,2,3}第二次时调用count(),当然是2,3,4了
      

  2.   

    第一次结束后
    count[]={1,2,3}count()方法是自加1,当然是{2,3,4}
      

  3.   

    再问一句,这里不是已经调用了3次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);            }
      

  4.   

    inthirties意思是第二个for循环中之应该是1吗?
      

  5.   

    调用了3次,但是3个变量,count[]是个数组,第一个是1,第二个是2,第三个是3
      

  6.   

    i=0时:count[i].set(countVal); /* 加1,并打印结果到屏幕上 */ countVal = count[i].count(); count对象的val=1