Java 无状态ejb未被销毁
我有一个用于开发目的的REST接口,它支持无状态EJB。它反过来注入另一个无状态EJB。据我所知,无状态EJB在每次需要实例时都会被销毁,而不是被动化和重构 使用此逻辑,我添加了一个@PostConstruct(对REST和其他无状态ejb都添加了@PostConstruct),但它们都只被调用一次(从日志中推断)。对REST层的重复调用将重用同一个bean(及其状态!),而不是创建一个新的bean 无状态bean没有被销毁的可能原因是什么?还是我误解了无状态ejb的生命周期 编辑:我指的“状态”是bean构造的一个临时缓存,用于加速执行。也许用词不当:) EDIT2:一些骨架代码:Java 无状态ejb未被销毁,java,jakarta-ee,Java,Jakarta Ee,我有一个用于开发目的的REST接口,它支持无状态EJB。它反过来注入另一个无状态EJB。据我所知,无状态EJB在每次需要实例时都会被销毁,而不是被动化和重构 使用此逻辑,我添加了一个@PostConstruct(对REST和其他无状态ejb都添加了@PostConstruct),但它们都只被调用一次(从日志中推断)。对REST层的重复调用将重用同一个bean(及其状态!),而不是创建一个新的bean 无状态bean没有被销毁的可能原因是什么?还是我误解了无状态ejb的生命周期 编辑:我指的“状态
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根据需要实例化,并由容器从实例池激活。可能是有助于理解问题的代码框架。因为无状态bean应该没有状态,所以根本不应该初始化它。如果你这样做,你可能是误用了一些东西。顺便说一句,RESTTools是一个REST服务,而不是REST客户端。你说得对,日志记录已关闭:)无论如何,我似乎必须更改/废弃缓存。你混淆了有状态bean和无状态bean。如果bean需要初始化,那么它应该是有状态的,并且这些bean确实是按需构造和销毁的(与无状态bean不同)。这是否意味着无状态bean永远不会被销毁?或者类似gc的东西:理论上是,但你不能指望它?这取决于容器。我建议在谷歌上搜索/阅读。