EJB3:有状态bean:如何访问在jndi查找中创建的第一个实例

时间:2014-12-22 08:04:42

标签: java ejb-3.0 stateful

我的代码:

@Local
public interface IA{

   public void setX(String x);

   public String getX();


}

@Stateful
@LocalBinding(jndiBinding="a/b/c")
public class BC implements IA{

private String value;p

  @Override
  public void setX(String x) {
    this.value = x;
  }

  @Override
  public String getX() {
    return this.value;
  }

}

我查找bean,然后设置x。然后将响应发送回客户端。客户端触发一个新请求,作为处理此请求的一部分,我需要先查找数据集。这就是我做的方式

InitialContext ic = new InitialContext();
IA ia= (IA)ic.lookup("a/b/c");
String x = ia.getX();

此时我记录字符串x,我得到null。 我检查了jmx控制台,看看是否创建了一个新实例,并确实创建了它。每次查找完成后,都会创建一个新实例。

我需要的是访问先前设置的值。这有可能吗?

2 个答案:

答案 0 :(得分:0)

这是按预期工作的:有状态会话bean的每次查找都将返回一个新实例。如果要保存实例,则需要将ia存储在某处。 (如果您不想保存实例,则需要调用@Remove方法以避免浪费内存.EJB容器最终应该超时实例,但如果您知道,最好立即将其删除完成它。)

答案 1 :(得分:0)

新实例(Object)将拥有自己的一组值或状态。因为它们彼此独立。像你说的那样:

  

我查找bean,然后设置x。然后将响应发送回   客户。作为处理此问题的一部分,客户端会触发新请求   请求我需要先查找数据集。

您可以提前获取该值并将其设置为单独对象,如:

InitialContext ic = new InitialContext();
IA ia= (IA)ic.lookup("a/b/c");
String x = ia.setX(OldValue);

我认为这是一个单独的方法:

String oldvalue = oldObj.getX();
fireNewRequest(oldValue);