2013-05-28 1 views
1

я попробовать следующее здесь: У меня есть WebApplication, который вызывает удаленный EJB: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|#] 

Что-то не так, или невозможно использовать call-by-reference с удаленными EJB?

ответ

0

есть проблема в реализации бина в SessionStation. Это введение и использование переменной

private Token token = new Token(); 

В соответствии со спецификацией here,

Когда клиент вызывает методы лица без фасоли, переменные экземпляра бина могут содержать состояние, специфичные для этот клиент, но только на время вызова. Когда метод завершен, не следует сохранять состояние, зависящее от клиента.

Простые слова, каждый вызов вашего сеансового компонента, скорее всего, будет работать, скорее всего, в отдельном и независимом потоке или контексте, который соответствующим образом свяжет и инициализирует вашу переменную экземпляра.