标签: stateless-session-bean

何时在无状态会话bean上使用有状态会话bean?

有状态会话bean定义如下:

有状态会话Bean对象的状态由其实例变量的值组成.在有状态会话bean中,实例变量表示唯一的客户端bean会话的状态.因为客户端与其bean交互("会话"),所以这种状态通常称为会话状态.

无状态会话bean定义如下:

无状态会话Bean无状态会话Bean不与客户端保持会话状态.当客户端调用无状态bean的方法时,bean的实例变量可能包含特定于该客户端的状态,但仅限于调用期间.方法完成后,不应保留特定于客户端的状态.但是,客户端可以更改池化无状态bean中的实例变量的状态,并且此状态将保留到池化无状态bean的下一次调用.除了在方法调用期间,无状态bean的所有实例都是等效的,允许EJB容器将实例分配给任何客户端.也就是说,无状态会话bean的状态应该适用于所有客户端.

使用无状态会话bean而不是有状态会话bean的优点如下:

由于无状态会话bean可以支持多个客户端,因此它们可以为需要大量客户端的应用程序提供更好的可伸缩性.通常,应用程序比有状态会话bean需要更少的无状态会话Bean,以支持相同数量的客户端.

所以我想到的问题是,何时应该使用有状态会话bean?为了我对这个问题的天真理解,我应该坚持使用无状态会话bean.

应该使用有状态会话bean的候选者是什么?有什么好例子吗?

会话Bean

java spring ejb stateless-session-bean stateful-session-bean

78
推荐指数
2
解决办法
7万
查看次数

为什么池无状态会话bean?

Java中的无状态bean不会在客户端的两次调用之间保持状态.因此,简而言之,我们可能会将它们视为具有业务方法的对象.每个方法都接受参数并返回结果.调用该方法时,会在执行堆栈中创建一些局部变量.当方法返回时,将从堆栈中删除本地,如果分配了一些临时对象,则无论如何都会对它们进行垃圾回收.

从我的观点来看,它与通过单独的线程调用同一单个实例的方法没有区别.那么为什么容器不能使用bean的一个实例而不是汇集其中的一个?

java ejb stateless-session-bean pooling

27
推荐指数
1
解决办法
1万
查看次数

是否可以@Inject一个@RequestScoped bean进入@Stateless EJB?

是否可以将请求范围的CDI bean注入无状态会话bean?

我曾经问了一个相关的问题,并认为具体的CDI @RequestScoped @Stateless问题值得自己发帖.

在EJB方法/ @RequestScoped和@Stateless之间传递状态

我还问了一个关于JMS @MessageDriven bean的类似问题 - 基本上想要了解@Stateless的相同内容.

@RequestScoped将CDI注入@MessageDriven bean

stateless-session-bean java-ee cdi java-ee-6 ejb-3.1

18
推荐指数
1
解决办法
1万
查看次数

具有实例变量的无状态会话bean

我有一个无状态会话bean,它包含一个公共方法,几个私有方法和一些实例级变量.下面是一个伪代码示例.

private int instanceLevelVar

public void methodA(int x) { 
  this.instanceLevelVar = x;
  methodB();
}

private void methodB() {
  System.out.println(instanceLevelVar);
}
Run Code Online (Sandbox Code Playgroud)

我所看到的是,methodB正在打印未传递给MethodA的值.最好我可以告诉它从同一个bean的其他实例打印值.什么会导致这个?

我应该指出代码在99.9%的时间内按预期工作.但是,.01%对我来说是一个严重的问题/担忧.

我明白,如果我有不同的公共方法,那么我可能不会在调用之间获得相同的bean,这会导致这种行为.但是,在这种情况下,唯一的调用是单个公共方法.容器(在这种情况下是Glassfish)是否仍会在私有方法调用之间交换bean?

(编辑)我将"类级别"重命名为"实例级别",因为这引起了一些混乱.

java glassfish stateless-session-bean java-ee

15
推荐指数
3
解决办法
2万
查看次数

调用@Stateless bean的@Asynchronous方法时的ContextNotActiveException

@Stateless在异步Servlet中注入一个bean并@Asynchronous从Serrvlet 调用方法.在jboss的服务器日志中,我无法看到任何异常但是在启动Java Mission Control时,我会看到ContextNotActiveExcetionServlet调用该@Asyncrhonous方法的时候.

Servlet ::

@WebServlet(urlPatterns = { "/asyncservice" }, asyncSupported = true)
public class AsyncServiceServlet extends HttpServlet {

@Inject
private Service service;

protected void doPost(final HttpServletRequest request, final HttpServletResponse response)
        throws ServletException, IOException {
    final AsyncContext asyncContext = request.startAsync(request, response);
    asyncContext.start(new Runnable() {
        @Override
        public void run() {
            try {
                service.service(asyncContext);
            } catch (ContextNotActiveException | IOException e) {
                e.printStackTrace();
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

服务类::

@Stateless
public class Service {

@Asynchronous
public …
Run Code Online (Sandbox Code Playgroud)

java asynchronous ejb stateless-session-bean java-ee

13
推荐指数
1
解决办法
1005
查看次数

在Weblogic 10.3中调用EJB时​​出现NameNotFoundException

我有一个EJB定义如下:

package com.foo;
@Stateless (mappedName="HelloWorld")
public class HelloWorldBean implements HelloWorld, HelloWorldLocal
....
Run Code Online (Sandbox Code Playgroud)

当它部署到Weblogic(WL)时,它获得名称myBean.我不确定这是否重要.

我尝试使用以下代码调用bean:

Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL, "t3://localhost:7001");
ic = new InitialContext(ht);
tp = (HelloWorld) ic.lookup("HelloWorld#com.foo.HelloWorldBean");
Run Code Online (Sandbox Code Playgroud)

任何人都知道我为什么会收到以下错误?

javax.naming.NameNotFoundException: While trying to lookup 'HelloWorld#com.foo.HelloWorldBean' didn't find subcontext 'HelloWorld#com'.
 Resolved '' [Root exception is javax.naming.NameNotFoundException: While trying
 to lookup 'HelloWorld#com.foo.HelloWorldBean' didn't find
 subcontext 'HelloWorld#com'. Resolved '']; remaining name 'HelloWorld#com/foo/HelloWorldBean'
Run Code Online (Sandbox Code Playgroud)

java weblogic stateless-session-bean ejb-3.0 weblogic-10.x

7
推荐指数
1
解决办法
4万
查看次数

Java EE 6:如何从无状态会话Bean调用有状态会话Bean?

我有一个状态会话Bean(SFSB),它充当身份验证模块.在SFSB中,我存储了当前登录的用户.此外,我还有一些外观(无状态会话Bean(SLSB))处理我的实体的JPA/SQL内容.为了检查当前用户的访问权限,我尝试从SLSB中调用SFSB.但是当从SLSB调用时,当前用户字段始终为"null".直接调用SFSB时,正确设置当前用户字段...对于调用,我使用@EJB注释.

任何想法可能是什么问题?这是某种上下文问题吗?通常是否可以从SLSB调用SFSB来保留它的状态?

提前谢谢了!

java ejb stateless-session-bean stateful-session-bean

7
推荐指数
2
解决办法
9112
查看次数

WELD-001408注入EntityManager时不满意的依赖关系

我有@Statelessbean实现两个接口(远程和本地).我还添加@LocalBean了用于通过无接口视图访问bean的anotation.

@Stateless
@LocalBean
public class WeatherDataBean implements WeatherDataBeanRemote, WeatherDataBeanLocal {
    @Inject
    private EntityManager entityManager;

    public WeatherDataBean () {

    }
    // ....attributes, getter & setter methods ....
}
Run Code Online (Sandbox Code Playgroud)

我使用@Inject这个原因取自JBoss AS7快速启动的这个例子:

我们使用来自CDI的"资源生成器"模式,将实体管理器的旧式@PersistenceContext注入"别名"为CDI样式注入.这允许我们在整个应用程序中使用一致的注入样式(@Inject).

以前我用过:

@PersistenceContext(unitName="WeatherStationJPA")
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)

在EJB中,它没有任何问题.但是使用@Inject注释我得到这个错误:

WELD-001408在注入点[[field] @Inject private ejb.WeatherDataBean.entityManager]中带有限定符[@Default]的[EntityManager]类型的不满意依赖项

这是我如何定义类资源:

public class Resources {
     @SuppressWarnings("unused")
     @PersistenceContext(unitName="WeatherStationJPA")
     @Produces
     private EntityManager entityManager;

     @Produces
     FacesContext getFacesContext() {
         return FacesContext.getCurrentInstance();
     }
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试注入实体管理器,为什么会出现此错误?

编辑: 根据@LightGuard的请求,我正在添加我用来引用注释的包:

  1. WeatherDataBean有:

    import javax.ejb.LocalBean;
    import javax.ejb.Stateless;
    import javax.inject.Inject; …
    Run Code Online (Sandbox Code Playgroud)

dependency-injection stateless-session-bean entitymanager cdi java-ee-6

7
推荐指数
2
解决办法
2万
查看次数

在无状态会话Bean中拥有全局变量有什么意义?

我们知道无状态会话豆不以任何方式持有国家.那么在无状态会话Bean中拥有全局变量有什么意义呢?为什么它没有在规范中被阻止(以避免不必要的混淆)?

如果有全局变量有任何实际好处,请用一段代码片段解释.

ejb stateless-session-bean

7
推荐指数
2
解决办法
1952
查看次数

EJB3业务逻辑模式和实践

我正在使用EJB3(用于应用程序和Web服务层的Hibernate + Glassfish,用于Web UI的Glass on Glassfish)开发Java中的多层财务处理应用程序,我正在努力解决在何处使用把我的业务逻辑.

当这个项目开始时,我们的第一个想法是将大部分业务逻辑放入无状态会话bean中.但是,随着时间的推移,我们发现EJB框架提供的依赖注入过于局限,因此我们的许多业务逻辑最终都出现在由Guice在无状态会话bean的@PostConstruct方法中组装的POJO中. .这一进展导致我们的会话bean和POJO之间的业务逻辑分散,我正试图找出一种方法来纠正这个问题.

最初,我们尝试让我们的Web层使用会话bean的远程接口来执行一些可以从UI和Web服务层访问的功能,这些功能由@ WebService-annotated无状态会话bean提供.从持久性和性能的角度来看,这是一场噩梦,因为我们的实体图可能会变得非常大,并且将分离的实体图重新附加到持久化上下文,结果是非常容易出错,所以我们的解决方案是开始只是传递对象数据库周围的标识符,无论它们在何处需要,都可以从中查找实体.

我的基本问题是:您可以建议什么原则和指导方针来决定业务逻辑是应该进入会话bean还是POJO?在给定复杂的对象图的情况下,何时传递实体bean是有意义的?

java jpa stateless-session-bean java-ee ejb-3.0

6
推荐指数
1
解决办法
2557
查看次数