gpt4 book ai didi

java - 针对从 Servlet 中的上下文查找的 EJB 注入(inject)

转载 作者:搜寻专家 更新时间:2023-11-01 02:46:59 25 4
gpt4 key购买 nike

如果我们有 statless bean,那么它可以通过@EJB 注解注入(inject)到 Servlet 中。例如:

@Stateless
public class LongTimeService {
public void do() {
//logic
}
}

public class ServletWithBean extends HttpServlet {
@EJB
private LongTimeService bean;

@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
bean.do;
...
}
}

在这种情况下,在 Servlet 的整个生命周期中,我们将只有一个 LongTimeService bean 实例。从 ejb 容器的角度来看,当 web 容器将使用 bean 构造 Servlet 时,它会从 ejb 容器中请求实例,并将保留该实例,直到 servlet 被销毁,并且每个 servlet 请求将仅适用于一个实例。我认为这是使用 Statless EJB 的糟糕方式,因为它不会为这种用途而创建。对于这个 perpes 例如有用的@Singleton statfull bean。但是如果我们想使用无状态 bean,那么我们可以每次在方法内部从 Context 中查找这个 bean 的实例。

public class ServletWithBean extends HttpServlet {

@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
Context ctx = new InitialContext();
LongTimeService bean = context.lookup("LongTimeService");
bean.do;
...
}
}

使用这种方法是否正确且可行?

最佳答案

From ejb container perspective when web container will construct Servlet with bean it ask instance from ejb container and will keep this instance until servlet will be destroed and every servlet request will work only with one instance.

你的推理是对的,但是,注入(inject)到servlet类成员中的实例实际上是一个名为Stub或Proxy的对象的实例,它并不是真正的EJB实例。

基本上,每次从 servlet 调用 ejb 的方法时,Stub 都会向 ejb 容器询问对 ejb 的引用,容器将从池中获取可用的 ejb,此 ejb 将处理请求,一旦工作完成后它会回到池中。

因此,如果您的 servlet 同时处理多个请求, stub 将针对每个请求获得不同的 ejb 引用。

请注意, stub 对象实现需要是线程安全的(对于无状态 bean,它是)。

I think this is bad way to use Statless EJB because th don't create for such kind of usage.

根据以上几点,是的,你可以从servlet中使用@EJB注入(inject)。

关于查找 stub 方法:

它也可以工作(每个请求你会得到一个 stub ),但它不是无状态所必需的,它有一个重要的缺点:查找是一个耗时的操作,因此,你的服务会有延迟无补偿时间响应。

希望对你有帮助

关于java - 针对从 Servlet 中的上下文查找的 EJB 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19853181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com