2013-05-28 77 views
1
呼叫

我在這裏嘗試以下操作: 我有調用遠程EJB web應用:Glassfish的3.1.2 - 遠程EJB - 通過參考

@WebServlet("/token") 
@SuppressWarnings("serial") 
public class TokenServlet extends HttpServlet { 

@EJB 
private TokenService tokenService; 

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 
    Token token = tokenService.getToken(); 

    tokenService.setToken(token); 

} 

}

服務EJB:

@Stateless 
@Remote 
public class TokenServiceImpl implements TokenService { 

private Token token = new Token(); 

@Override 
public Token getToken() { 
    System.out.println("class: " + TokenServiceImpl.class 
      + ", method: getToken() - " + "token value: '" 
      + token.getToken() + "' reference: " + this.token); 

    return this.token; 
} 

@Override 
public void setToken(Token token) { 
    boolean referenceEquality = this.token == token; 
    boolean valueEquality = this.token.equals(token); 
    System.out.println("class " + TokenServiceImpl.class 
      + ", methos: setToken(Token token)"); 
    System.out.println("test for reference equality: " + " " + this.token 
      + " == " + token + " --> " + referenceEquality); 
    System.out.println("test for value equality: " + " " + this.token 
      + " equals " + token + " --> " + valueEquality); 

    this.token = token; 
} 

webproject(.war)和ejbproject(.ear)分別部署在glassfish-application.xml條目中:

<!DOCTYPE glassfish-application PUBLIC "-//GlassFish.org//DTD 
GlassFish Application Server 3.1 Java EE Application 6.0//EN" 
"http://glassfish.org/dtds/glassfish-application_6_0-1.dtd"> 
<glassfish-application> 
    <pass-by-reference>true</pass-by-reference> 
</glassfish-application> 

class: class TokenServiceImpl, method: getToken() - token value: '  
'default token value' reference: [email protected]|#] 

class TokenServiceImpl, method: setToken(Token token)|#] 
test for reference equality: [email protected] == [email protected] --> false|#] 
test for value equality: [email protected] equals [email protected] --> false|#] 

是不是有什麼不對或者不能使用遠程EJB的引用調用?

回答

0

無狀態會話Bean實現中存在問題。這是引進和使用可變

private Token token = new Token(); 

根據規範here的,

當客戶端調用無狀態bean的方法,bean的 實例變量可能含有特定的狀態該客戶端僅在調用期間 。當方法結束時, 不應保留特定於客戶端的狀態。

用簡單的話來說,對Session Bean的每個調用最有可能運行在一個單獨的獨立線程或上下文中,這會相應地關聯和初始化您的實例變量。