我正在阅读Java EE 6教程,我试图理解无状态和有状态会话bean之间的区别.如果无状态会话bean在方法调用之间不保持其状态,为什么我的程序按照它的方式运行?
package mybeans;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
@LocalBean
@Stateless
public class MyBean {
private int number = 0;
public int getNumber() {
return number;
}
public void increment() {
this.number++;
}
}
Run Code Online (Sandbox Code Playgroud)
客户端
import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import mybeans.MyBean;
import java.io.PrintWriter;
@WebServlet(name = "ServletClient", urlPatterns = { "/ServletClient" })
public class ServletClient extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
MyBean mybean;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws …Run Code Online (Sandbox Code Playgroud) 有状态会话bean定义如下:
有状态会话Bean对象的状态由其实例变量的值组成.在有状态会话bean中,实例变量表示唯一的客户端bean会话的状态.因为客户端与其bean交互("会话"),所以这种状态通常称为会话状态.
无状态会话bean定义如下:
无状态会话Bean无状态会话Bean不与客户端保持会话状态.当客户端调用无状态bean的方法时,bean的实例变量可能包含特定于该客户端的状态,但仅限于调用期间.方法完成后,不应保留特定于客户端的状态.但是,客户端可以更改池化无状态bean中的实例变量的状态,并且此状态将保留到池化无状态bean的下一次调用.除了在方法调用期间,无状态bean的所有实例都是等效的,允许EJB容器将实例分配给任何客户端.也就是说,无状态会话bean的状态应该适用于所有客户端.
使用无状态会话bean而不是有状态会话bean的优点如下:
由于无状态会话bean可以支持多个客户端,因此它们可以为需要大量客户端的应用程序提供更好的可伸缩性.通常,应用程序比有状态会话bean需要更少的无状态会话Bean,以支持相同数量的客户端.
所以我想到的问题是,何时应该使用有状态会话bean?为了我对这个问题的天真理解,我应该坚持使用无状态会话bean.
应该使用有状态会话bean的候选者是什么?有什么好例子吗?
java spring ejb stateless-session-bean stateful-session-bean
混淆使用JSF2 + Spring + EJB3或它们的任意组合让我感到有些困惑.我知道Spring的一个主要特性是依赖注入,但是我可以使用JSF托管bean @ManagedBean和@ManagedPropertyanotations,并获得依赖注入功能.使用EJB3,我更加困惑何时将其与JSF一起使用,或者甚至有理由使用它.
那么,在什么样的情况下使用Spring + JSF2或EJB3 + JSF2是个好主意?
到目前为止,我只使用JSF2创建了一些小型Web应用程序,从不需要使用Spring或EJB3.但是,我在许多地方看到人们正在将所有这些东西放在一起.
我不确定我在JSF中使用MVC环境的方法是否是最好的方法.由于我想要充分利用JSF,我想知道我的服务层(或模型,用MVC术语说)应该如何"设计".
我知道视图 - 控制器比率应该是1比1(排除例外情况).现在我应该以什么方式设计我的服务层?我应该使用一项大型服务(不这么认为)吗?如果没有,根据我应该分割我的服务?
注意,我的服务将从Beans(控制器以MVC术语)调用,服务本身将在必要时使用JPA调用DAO.
提前致谢
我正在使用JSF 2.2进行Web项目,现在我正在实现登录页面.
我有一个login.xhtml作为视图,一个名为的支持bean UserLoginView.
这个bean有一个EJB属性豆private UserService userService(如图所示这里).
这是否意味着每个UserLoginView新实例都获得了一个新实例UserService?
可以在生产环境中像这样实现吗?
为了通过WebSockets通知所有用户,当在选定的JPA实体中修改某些内容时,我使用以下基本方法.
@ServerEndpoint("/Push")
public class Push {
private static final Set<Session> sessions = new LinkedHashSet<Session>();
@OnOpen
public void onOpen(Session session) {
sessions.add(session);
}
@OnClose
public void onClose(Session session) {
sessions.remove(session);
}
private static JsonObject createJsonMessage(String message) {
return JsonProvider.provider().createObjectBuilder().add("jsonMessage", message).build();
}
public static void sendAll(String text) {
synchronized (sessions) {
String message = createJsonMessage(text).toString();
for (Session session : sessions) {
if (session.isOpen()) {
session.getAsyncRemote().sendText(message);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当修改选定的JPA实体时,会引发适当的CDI事件,该事件将由以下CDI观察者观察.
@Typed
public final class EventObserver {
private EventObserver() {}
public void …Run Code Online (Sandbox Code Playgroud) 我知道无状态会话Bean是指EJB bean,而Request Scoped是指CDI bean(或JSF托管bean),因此我将首先从Java EE Tutoriel中提供它们的两个定义.
无状态会话Bean定义:
无状态会话bean不与客户端保持会话状态.当客户端调用无状态bean的方法时,bean的实例变量可能包含特定于该客户端的状态,但仅限于调用期间.方法完成后,不应保留特定于客户端的状态.
CDI Request Scoped定义:
用户在单个HTTP请求中与Web应用程序的交互.
我从这两个定义中理解的是,无状态会话bean的概念与请求范围概念相同,但我不确定,因为命名"会话"使我感到困惑.所以,我问自己是否是这种情况(相同的概念),也许他们会有类似的命名(使用请求而不是会话).
所以,我的问题是:EJB无状态会话bean和CDI/JSF请求范围bean之间是否有任何概念上的区别?
我正在阅读无状态会话bean,无法理解它的用法.
摘自下面的太阳教程
"..因为无状态会话bean可以支持多个客户端,它们可以为需要大量客户端的应用程序提供更好的可伸缩性"
在哪里使用无状态会话bean?什么样的应用程序使用它?
在"无状态会话bean"出现之前使用了什么机制来支持类似上下文中的多个客户端?
有人可以提供一些细节吗?
谢谢!
我正在阅读Java EE7文档,这就是无状态bean所说的内容.我对以下粗体标注的语句的含义感到困惑
无状态会话bean不与客户端保持会话状态.当客户端调用无状态bean的方法时,bean的实例变量可能包含特定于该客户端的状态,但仅限于调用期间.方法完成后,不应保留特定于客户端的状态.但是,客户端可以更改池化无状态bean中的实例变量的状态,并且此状态将保留到池化无状态bean的下一次调用.除了在方法调用期间,无状态bean的所有实例都是等效的,允许EJB容器将实例分配给任何客户端.也就是说,无状态会话bean的状态应该适用于所有客户端.
但是从这篇文章中, 无状态会话bean中的实例变量
无状态会话bean是一个没有关联的会话状态但可能具有实例状态的对象.它不允许并发访问bean.实例变量的内容不保证跨方法调用保留.客户端应认为无状态会话bean的所有实例都是相同的.
我觉得这里有矛盾.文档声称(根据我的理解)实例变量状态在下一次调用中保留,而后者声明无法保证状态得到保留.
请解释
PS:我确实看过这篇文章:但我没有理解答案
编辑形成上面的SO帖子
无状态会话Bean(SLSB)不依赖于一个客户端,并且无法保证一个客户端在每个方法调用时获取相同的实例(某些容器可能会在每个方法调用会话中创建和销毁bean,这是特定于实现的决策,但实例通常是合并的 - 我没有提到集群环境).换句话说,尽管无状态bean可能具有实例变量,但这些字段并非特定于一个客户端,因此不要在远程调用之间依赖它们.
我不知道可能是我的问题完全没有意义,但我找不到任何关于它的直接信息.
我有我的JSF + Tomcat应用程序,它运行得很好.我想实现Restful服务和JAAS逻辑.为了做到这一点,我改用了TomEE ++.
切换到TomEE意味着我的服务器现在会更加沉重,我担心它比我在Amazon AWS微实例中需要的资源cpu和ram资源更多.
问题是:如果我只从JSF托管bean切换到JSF + EJB,性能是否会下降?
子问题是: EJB注入可以做什么,而JSF托管bean不能做什么?(例如,JSF不允许循环注入)
是否可以在无状态bean中访问有状态会话bean?
我的问题是我有一个名为User的会话bean,我想在无状态bean中访问用户信息...
我这样想:
@Stateless
public class OfferManagerBean implements OfferManagerLocal, OfferManager
{
@Resource
private SessionContext context;
@EJB
private ro.project.ejb.interfaces.User user;
public String getUsername()
{
user = (ro.project.ejb.interfaces.User) context.lookup("java:global/project/projectEJB/User!ro.project.ejb.interfaces.User");
return user.getUsername();
}
Run Code Online (Sandbox Code Playgroud)
User user = (User) ctx.lookup("java:global/project/projectEJB/User!ro.project.ejb.interfaces.User");
user.setUsername("Alex");
OfferManager offerManager = (OfferManager) ctx.lookup("java:global/project/projectEJB/OfferManagerBean!ro.project.ejb.interfaces.OfferManager");
assertEquals(offerManager.getUsername(), "Alex");
Run Code Online (Sandbox Code Playgroud)
这个测试用例的结果是 java.lang.AssertionError: expected:<null> but was:<Alex>
它失败..似乎我如何请求有状态的bean返回一个新实例...
我问的是这个人问的几乎一样的东西:rmi ejb调用中可重用登录会话的概念
我想这样做但不是JAAS ...
先感谢您
我们有几个带有Request,View和Session Scope的JSF托管bean,并且正在运行WebLogic 11g(10.3.2).Weblogic的不支持Managed Bean的一个JSF的@EJB注解,所以我们使用这些程序http://technology.amis.nl/2008/12/06/ejb-dependency-injection-of-session-bean-facade- in-jsf-12-on-weblogic-103-jsf-with-jpa /创建一个ServletConextListener,使用@EJB注释加载EJB引用.
实际上,从JSF Managed Bean中,我们可以通过从ServletContext获取它来查找我们希望使用的EJB的EJB接口.
所以问题是:
1)将EJB接口作为ManagedBean上的实例变量是否可以?(理由是在页面循环期间多次调用EJB)
2)如果我们确实将它们作为实例变量,我们是否应该将EJB接口实例变量标记为瞬态变量?
我正在学习一些教程后的Java持久性.
我正在使用Java EE 7和Payara服务器.
我注意到每个使用不同的持久性方法.
例子:
简单
@Stateless
public class BookServiceBean implements BookService {
@PersistenceContext
private EntityManager em;
public void createOrUpdate(Book book) {
em.persist(book);
}
public void remove(Book book) {
em.remove(book);
}
}
Run Code Online (Sandbox Code Playgroud)with flush(),这是在persistene.xml中的 "AUTO"上没有设置验证策略时使用的,对吧?
@Stateless
public class BookServiceBean implements BookService {
@PersistenceContext
private EntityManager em;
public void createOrUpdate(Book book) {
em.persist(book);
em.flush();
}
public void remove(Book book) {
em.remove(book);
em.flush();
}
}
Run Code Online (Sandbox Code Playgroud)与交易
@Stateless
public class BookServiceBean implements BookService {
@PersistenceContext
private EntityManager em;
public void …Run Code Online (Sandbox Code Playgroud)