【问题标题】:Stateless ejb not getting destroyed无状态 ejb 没有被破坏
【发布时间】:2012-07-05 17:06:16
【问题描述】:

我有一个用于开发目的的 REST 接口,它支持无状态 EJB。它反过来注入另一个无状态 EJB。我的理解是,每次需要实例时,无状态 EJB 都会被销毁,而不是钝化和重建。

使用这个逻辑,我添加了一个@PostConstruct(对 REST 和其他无状态 ejb),但两者都只被调用一次(从日志记录中推断)。对 REST 层的重复调用将重用同一个 bean(及其状态!),而不是创建一个新的。

无状态 bean 没有被销毁的可能原因是什么?还是我误解了无状态 ejb 的生命周期?

编辑:我所指的“状态”是 bean 构造以加速执行的临时缓存。也许是一个糟糕的词选择:)

EDIT2:一些骨架代码:

import javax.ejb.Stateless;
import javax.ejb.EJB;
import javax.ws.rs.Path;

@Path("tools")
@Stateless
public class RESTTools {

@EJB
private CatalogueLocal catalogue;

@PostConstruct
public void initialize() {
    logger.debug("Initializing REST client");
}
}

@Stateless
@Local(CatalogueLocal.class)
@TransactionManagement(TransactionManagementType.BEAN)
public class Catalogue {

@PostConstruct
public void initialize() {
    logger.debug("Initializing catalogue");
}

}

【问题讨论】:

  • 可能是有助于理解问题的代码骨架。否则它会在黑暗中拍摄。
  • 由于无状态 bean 应该没有状态,所以根本不应该初始化它。如果你正在这样做,你可能会误用某些东西。顺便说一句,RESTTools 是一个 REST 服务,而不是一个 REST 客户端
  • 你说得对,日志记录已关闭 :) 无论如何,看来我必须更改/废弃缓存。
  • 您混淆了有状态和无状态 bean。如果需要初始化 bean,它应该是有状态的,并且确实是按需构造和销毁的(与无状态 bean 不同)。

标签: java jakarta-ee


【解决方案1】:

我相信你误解了生命周期。

无状态 bean 会根据需要进行实例化,并由容器从实例池中激活。

【讨论】:

  • 这是否意味着无状态bean永远不会被销毁?或者像 gc: 理论上是这样,但你不能指望它?
  • 这取决于容器。我建议谷歌搜索/阅读它。
猜你喜欢
  • 2021-06-11
  • 2017-10-30
  • 2011-09-19
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多