我正在阅读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
我正在学习EJB3,我很好奇什么时候使用SFSB很方便?当SFSB轻易解决一些复杂的问题时,我找不到任何好的例子.
实际上我看到SLSB可以用作网络服务,这很方便.但我不知道何时使用SFSB.我只看到它的问题,因为我们应该学习一些关于它的东西,我们应该编写一个由注释组成的代码,然后我们应该使用恼人的查找...而且我们没有得到任何好的回报.
例如,我们不能使用SLSB中的SFSB,因为有状态对象只能用于有状态上下文.我们不能在servlet中使用DI,而是应该使用JNDI查找手动创建SFSB实例,然后将其放入HttpSession对象中.它不能是网络服务.
我在SFSB中看到的唯一好处是事务管理.但我认为,当我们真的需要一个交易并且我们不需要DB时,这种情况很少见.我可以想象,当我们将数据存储在XML文件中并使用SFSB中的事务管理来管理非关系数据库时,它确实非常有用.
我几乎可以肯定我完全错了,所以给我一些非常好的SFSB用法示例.
如果我有@ManagedBean这个@SessionScoped,为什么我会使用@StatefulEJB?我之前用过购物车并保持会话状态,但由于托管bean将在用户会话期间保存,我可以在那里存储状态,然后调用SLSB以获取业务逻辑.那是对的吗?如果是,那么有状态的ejbs将留给更具体的应用程序,例如何时需要交易等?
我想用耳朵项目进行聚类.我找到了一个使用standalone-ha.xml配置在群集中独立运行的解决方案.我跟着下面的文章.它工作正常. 使用wildfly9在域模式下进行集群 但是我想运行具有ear和stateful ejb的ERP项目.所以我在独立模式下运行集群.
我有两台机器ip是不同的,例如
1.10.10.10.10 node1
两台机器都有wildfly9,为了测试目的,我创建了一个带有web组件的示例状态ejb项目.
我运行服务器的命令是:
standalone.bat -c standalone-ha.xml -b 10.10.10.10 -u 230.0.0.4 -Djboss.node.name=node1
Run Code Online (Sandbox Code Playgroud)
和
./standalone.sh -c standalone-ha.xml -b 20.20.20.20 -u 230.0.0.4 -Djboss.node.name=node2
Run Code Online (Sandbox Code Playgroud)
我的项目Test.war有状态ejb和servlet和jsp.1)Bank.java是有状态的ejb,它实现了远程和本地接口
@Stateful(passivationCapable=true)
public class Bank implements BankRemote,BankLocal {
private int amount=0;
@Override
public boolean withdraw(int amount) {
if(amount<=this.amount){
this.amount-=amount;
return true;
}else{
return false;
}
}
@Override
public void deposit(int amount) {
this.amount+=amount;
}
@Override
public int getBalance() {
return amount;
}}
Run Code Online (Sandbox Code Playgroud)
2)OpenAccount.java是servlet
@WebServlet("/OpenAccount")
public class OpenAccount extends HttpServlet {
protected void …Run Code Online (Sandbox Code Playgroud) 如果有状态会话bean要钝化,则将其状态写入硬盘,然后释放bean实例以提供其他请求(至少这是我的理解).当同一个客户端再次处于活动状态时,bean实例将从硬盘读取状态以重新获得状态.但是bean实例如何知道哪个客户端必须读取哪个文件来维护状态呢?
我是J2EE的新手,所以如果我问一个非常天真的怀疑,请原谅我.如果我需要了解任何其他主题来理解这一点,请指出我正确的方向.
我有一个状态会话Bean(SFSB),它充当身份验证模块.在SFSB中,我存储了当前登录的用户.此外,我还有一些外观(无状态会话Bean(SLSB))处理我的实体的JPA/SQL内容.为了检查当前用户的访问权限,我尝试从SLSB中调用SFSB.但是当从SLSB调用时,当前用户字段始终为"null".直接调用SFSB时,正确设置当前用户字段...对于调用,我使用@EJB注释.
任何想法可能是什么问题?这是某种上下文问题吗?通常是否可以从SLSB调用SFSB来保留它的状态?
提前谢谢了!
我是ejbs的新手,我想知道有状态会话bean是否会被销毁.我在servlet中注入了一个有状态会话bean.即使在30分钟后,我发现豆子是活跃的.我正在使用jboss eap 6.0.我相信HttpSession与有状态会话bean无关.我使HttpSession失效,以确保HttpSession与statful会话bean无关.那么,如果我的应用程序有很多用户,如果我创建一个新bean,那么我的服务器的性能就会降低.容器如何管理有状态会话bean.豆被移除或销毁的时间是什么时候?
我读过这篇文章和其他几篇文章.但我没有明白.
我有一个简单的问题,但我找不到Java EE 6的答案!
有状态会话bean是否应该实现Serializable?
我测试了有没有实现java.io.Serializable,没有不同的错误.
我的感觉告诉我,有状态会话bean必须实现Serializable,因为它可以在长期会话中持久化......
我正在尝试集成测试使用注入到控制器的spring session作用域bean的Spring Controller方法。为了使测试通过,我必须能够访问我的会话bean,以便在对该控制器方法进行模拟调用之前为其设置一些值。问题是当我进行调用而不是使用我从模拟应用程序上下文中拉出的那个时创建了一个新的会话bean。如何使我的控制器使用相同的UserSession bean?
这是我的测试用例
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("src/main/webapp")
@ContextConfiguration({"file:src/main/webapp/WEB-INF/applicationContext.xml",
"file:src/main/webapp/WEB-INF/rest-servlet.xml",
"file:src/main/webapp/WEB-INF/servlet-context.xml"})
public class RoleControllerIntegrationTest {
@Autowired
private WebApplicationContext wac;
protected MockMvc mockMvc;
protected MockHttpSession mockSession;
@BeforeClass
public static void setupClass(){
System.setProperty("runtime.environment","TEST");
System.setProperty("com.example.UseSharedLocal","true");
System.setProperty("com.example.OverridePath","src\\test\\resources\\properties");
System.setProperty("JBHSECUREDIR","C:\\ProgramData\\JBHSecure");
}
@Before
public void setup(){
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
mockSession = new MockHttpSession(wac.getServletContext(), UUID.randomUUID().toString());
mockSession.setAttribute("jbhSecurityUserId", "TESTUSER");
}
@Test
public void testSaveUserRole() throws Exception {
UserSession userSession = wac.getBean(UserSession.class);
userSession.setUserType(UserType.EMPLOYEE);
userSession.setAuthorizationLevel(3);
Role saveRole = RoleBuilder.buildDefaultRole();
Gson gson = new Gson();
String json = gson.toJson(saveRole);
MvcResult result = this.mockMvc.perform(
post("/role/save") …Run Code Online (Sandbox Code Playgroud) junit integration-testing spring-mvc stateful-session-bean mockmvc