首先贴出我的代码:
(这里为了节省空间,我省略了引入包)
●详细代码:
接口:
public interface StatelessEjb {
 public void compute(int i);
 public int getResult();
}
实现类:
@Stateless
@Remote
public class StatelessEjbBean implements StatelessEjb {
 private int state;
 @Override
 public void compute(int i) {
  state = state + i;
 }
 @Override
 public int getResult() {
  return state;
 }
}
客户端:
public class StatelessEjbClient {
public static void main(String[] args) {
  try {
   InitialContext ctx = new InitialContext();
   //第一次会话
   StatelessEjb ejb1 = (StatelessEjb) ctx.lookup("StatelessEjbBean/remote");
   System.out.println(ejb1.getResult());
   ejb1.compute(1);
   System.out.println(ejb1.getResult());
   ejb1.compute(1);
   System.out.println(ejb1.getResult());
   ejb1.compute(1);
   System.out.println(ejb1.getResult());
   //第二次会话
   StatelessEjb ejb2 = (StatelessEjb) ctx.lookup("StatelessEjbBean/remote");
   System.out.println(ejb1.getResult());
   ejb2.compute(1);
   System.out.println(ejb1.getResult());
   ejb2.compute(1);
   System.out.println(ejb1.getResult());
   ejb2.compute(1);
   System.out.println(ejb1.getResult());
  } catch (NamingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}●我的问题是:
我正确部署好以后,单步调试,可以输出结果:
0
1
2
3
3
4
5
6
但是直接运行的话输出的是不规则的结果:
0
0
0
0
1
2
1
1
这是什么原因?
着急ing~~~

解决方案 »

  1.   

    1 你的state 干啥用的?
    2 你不觉得你期望的结果,是有状态会话Bean的要求吗?原因:你的每个调用,服务器可能会随机分配一个Session Bean, 不一定是上次你刚使用过的。至于单步,我搞不懂,也许是每次你都很幸运,都拿到了你上次用过的那个。
      

  2.   

    抱歉,帖子代码有点错误,是我调整的时候弄错了,问题应该是这样:
    首先贴出我的代码: 
    (这里为了节省空间,我省略了引入包) 
    ●详细代码: 
    接口: 
    public interface StatelessEjb { 
    public void compute(int i); 
    public int getResult(); 

    实现类: 
    @Stateless 
    @Remote 
    public class StatelessEjbBean implements StatelessEjb { 
    private int state; 
    @Override 
    public void compute(int i) { 
      state = state + i; 

    @Override 
    public int getResult() { 
      return state; 


    客户端: 
    public class StatelessEjbClient { 
    public static void main(String[] args) { 
      try { 
      InitialContext ctx = new InitialContext(); 
      //第一次会话 
      StatelessEjb ejb1 = (StatelessEjb) ctx.lookup("StatelessEjbBean/remote"); 
      System.out.println(ejb1.getResult()); 
      ejb1.compute(1); 
      System.out.println(ejb1.getResult()); 
      ejb1.compute(1); 
      System.out.println(ejb1.getResult()); 
      ejb1.compute(1); 
      System.out.println(ejb1.getResult()); 
      //第二次会话 
       //<上面的问题在这里有错误,应该是>System.out.println(ejb2.getResult())
      StatelessEjb ejb2 = (StatelessEjb) ctx.lookup("StatelessEjbBean/remote"); 
      System.out.println(ejb2.getResult()); 
      ejb2.compute(1); 
      System.out.println(ejb2.getResult()); 
      ejb2.compute(1); 
      System.out.println(ejb2.getResult()); 
      ejb2.compute(1); 
      System.out.println(ejb2.getResult()); 
      } catch (NamingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 


    ●我的问题是: 
    我正确部署好以后,单步调试,可以输出结果: 








    但是直接运行的话输出的是不规则的结果: 








    这是什么原因? 
    着急ing~~~
      

  3.   


    谢谢1楼的回答,可是,我的session bean 是Stateless无状态的,
    那我调用的ejb1和ejb2不是同一个嘛?
      

  4.   

    state 变量要初始化 即private int state = 0
      

  5.   


    @Stateless
    @Remote
    public class StatelessEjbBean implements StatelessEjb { private int state = 0; public void compute(int i) {
    state = state + i;
    System.out.println("StatelessEjbBean: "+state);
    } public int getResult() {
    return this.state;
    }}
    public class StatelessTest extends Thread {
    public String showName ="";

    public StatelessTest(){
    }
    public StatelessTest(String name){
    showName = name;
    }
    @Override
    public void run() {
    try{
    InitialContext context = new InitialContext();
    StatelessEjb ejb= (StatelessEjb) context.lookup("StatelessEjbBean/remote");
    System.out.println(showName+" : "+ejb.getResult());
    ejb.compute(1);
    System.out.println(showName+" : "+ejb.getResult());
    ejb.compute(1);
    System.out.println(showName+" : "+ejb.getResult());
    ejb.compute(1);
    System.out.println(showName+" : "+ejb.getResult());
    ejb.compute(1);
    System.out.println(showName+" : "+ejb.getResult());
    ejb.compute(1);

    StatelessEjb ejb2= (StatelessEjb) context.lookup("StatelessEjbBean/remote");
    System.out.println(showName+" : "+ejb2.getResult());
    ejb2.compute(1);
    System.out.println(showName+" : "+ejb2.getResult());
    ejb2.compute(1);
    System.out.println(showName+" : "+ejb2.getResult());
    ejb2.compute(1);
    System.out.println(showName+" : "+ejb2.getResult());
    ejb2.compute(1);
    System.out.println(showName+" : "+ejb2.getResult());
    ejb2.compute(1);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    public class HelloWorldTest {
    public static void main(String[] args) throws Exception {
    StatelessTest st = new StatelessTest("ejb1");
    st.start();
    StatelessTest st2 = new StatelessTest("ejb2");
    st2.start();
    }
    }得到蛋疼的结果
    第一次:ejb1 : 0
    ejb2 : 0
    ejb1 : 0
    ejb2 : 1
    ejb2 : 1
    ejb1 : 2
    ejb2 : 2
    ejb1 : 1
    ejb1 : 2
    ejb2 : 4
    ejb2 : 2
    ejb2 : 3
    ejb2 : 4
    ejb2 : 5
    ejb2 : 6
    ejb1 : 5
    ejb1 : 5
    ejb1 : 4
    ejb1 : 8
    ejb1 : 6
    第二次:
    ejb2 : 6
    ejb1 : 9
    ejb1 : 5
    ejb2 : 10
    ejb2 : 10
    ejb1 : 6
    ejb1 : 9
    ejb2 : 11
    ejb1 : 10
    ejb2 : 12
    ejb2 : 13
    ejb1 : 11
    ejb2 : 14
    ejb1 : 11
    ejb2 : 15
    ejb1 : 12
    ejb2 : 16
    ejb1 : 8
    ejb2 : 17
    ejb1 : 12
    JBOSS里面打印的是两次
    18:20:54,980 INFO  [STDOUT] StatelessEjbBean: 118:20:54,980 INFO  [STDOUT] StatelessEjbBean: 118:20:54,995 INFO  [STDOUT] StatelessEjbBean: 118:20:54,995 INFO  [STDOUT] StatelessEjbBean: 218:20:55,012 INFO  [STDOUT] StatelessEjbBean: 218:20:55,019 INFO  [STDOUT] StatelessEjbBean: 318:20:55,038 INFO  [STDOUT] StatelessEjbBean: 218:20:55,050 INFO  [STDOUT] StatelessEjbBean: 318:20:55,064 INFO  [STDOUT] StatelessEjbBean: 418:20:55,082 INFO  [STDOUT] StatelessEjbBean: 518:20:55,169 INFO  [STDOUT] StatelessEjbBean: 318:20:55,180 INFO  [STDOUT] StatelessEjbBean: 418:20:55,190 INFO  [STDOUT] StatelessEjbBean: 518:20:55,203 INFO  [STDOUT] StatelessEjbBean: 618:20:55,213 INFO  [STDOUT] StatelessEjbBean: 718:20:55,235 INFO  [STDOUT] StatelessEjbBean: 418:20:55,263 INFO  [STDOUT] StatelessEjbBean: 818:20:55,284 INFO  [STDOUT] StatelessEjbBean: 618:20:55,342 INFO  [STDOUT] StatelessEjbBean: 518:20:55,365 INFO  [STDOUT] StatelessEjbBean: 918:21:15,758 INFO  [STDOUT] StatelessEjbBean: 718:21:15,758 INFO  [STDOUT] StatelessEjbBean: 1018:21:15,775 INFO  [STDOUT] StatelessEjbBean: 618:21:15,777 INFO  [STDOUT] StatelessEjbBean: 818:21:15,797 INFO  [STDOUT] StatelessEjbBean: 918:21:15,799 INFO  [STDOUT] StatelessEjbBean: 1118:21:15,809 INFO  [STDOUT] StatelessEjbBean: 1018:21:15,811 INFO  [STDOUT] StatelessEjbBean: 1218:21:15,823 INFO  [STDOUT] StatelessEjbBean: 1118:21:15,826 INFO  [STDOUT] StatelessEjbBean: 1318:21:15,872 INFO  [STDOUT] StatelessEjbBean: 1418:21:15,885 INFO  [STDOUT] StatelessEjbBean: 718:21:15,886 INFO  [STDOUT] StatelessEjbBean: 1518:21:15,900 INFO  [STDOUT] StatelessEjbBean: 1218:21:15,901 INFO  [STDOUT] StatelessEjbBean: 1618:21:15,915 INFO  [STDOUT] StatelessEjbBean: 818:21:15,918 INFO  [STDOUT] StatelessEjbBean: 1718:21:15,942 INFO  [STDOUT] StatelessEjbBean: 918:21:15,944 INFO  [STDOUT] StatelessEjbBean: 1818:21:15,960 INFO  [STDOUT] StatelessEjbBean: 19
      

  6.   

    要么也可能是各个EJB容器实现的问题吧,在JBOSS里面是各个版本的问题
    各服务器之前也可能不同,反正Stateless只能执行以下获取服务器时间这种不需要缓存数据的纯业务或者计算的东西
    反正刚刚接触EJB还是很美好的,没成想哎~~~
      

  7.   


    你到底有没有理解什么叫无状态BEAN 和 有状态BEAN啊  ?
      

  8.   

    我们常说stateful session bean指的是该session bean可以保存会话状态,对于每一个client,都有其相应的实例。当会话结束时,stateful session bean也会被销毁。而对于stateless session bean,可能则由一个或几个实例,服务于所有的client,当client结束调用时,stateless session bean实例会被保留,供以后使用。 这也是为什么我们说stateless的性能要比stateful好。 另一方面,多个client可能使用同一个stateless session bean实例,表明stateless是非线程安全的,因此对于实例变量的使用,应当是非常谨慎。如果随意的修改实例变量,可能会导致多个线程之间的不一致。这个道理,其实和servlet是一样的。 而对于stateful session bean,则没有这样的限制。可以随意的修改实例变量,而不会造成冲突。 静态变量和实例变量不同,它本身就不是线程安全的,如果想要在session bean中添加静态变量,你最好知道自己在做什么。 就是这样的多个实例,你调用的时候不可以控制到底调用的是哪个,完全由容器觉得