当前位置:首页 » 网购平台 » 无状态会话bean购物车
扩展阅读
宁波奥德赛优惠价格 2021-03-15 14:26:02
丹尼斯购物卡能挂失么 2021-03-15 14:25:58
淘宝购物指纹验证失败 2021-03-15 14:24:44

无状态会话bean购物车

发布时间: 2021-01-25 17:23:51

⑴ EJB有状态的会话Bean和无状态的会话Bean的区别

在EJB里面,会话Bean分为两种,一种是有状态的会话Bean,另一种是无状态的会话Bean,本节主要讲解一下两者之间的区别。
对于有状态的会话Bean,这种情况属于,服务端与你单独开辟了一块空间与你进行交互。而客户端感觉服务端单独为他自己服务似的。而无状态的会话Bean,则服务端不提供了一个资源但是谁用都行,他不负责。所以客户端在使用的时候,则会感到这个服务 与其他人共享似的。
服务端
分别创建一个有状态的会话bean和一个无状态的会话 Bean。
新建一个EJB项目
新建项目1
新建项目2
然后创建两个接口,两个实现。(分别是有状态和无状态)
有状态会话Bean的接口和实现:
public interface StatefulEjb {
public void compute(int i);
public int getResult();
}
@Stateful
@Remote(StatefulEjb.class)
public class StatefulEjbBean implements StatefulEjb {
private int state;
public void compute(int i) {
state += i;
}
public int getResult() {
return state;
}
}
无状态会话Bean的接口和实现:
public interface StatelessEjb {
public void compute(int i);
public int getResult();
}
@Stateless
@Remote(StatelessEjb.class)
public class StatelessEjbBean implements StatelessEjb{
private int state;
public void compute(int i) {
state += i;
}
public int getResult() {
return state;
}
}
创建完之后的结构如下:
服务端接口
之后部署到JBOSS上,(我用的版本是jboss-5.0.1.GA)然后启动JBOSS这样服务端就搭建好了。
客户端
创建一个Java项目,然后添加一个main方法,这个就不详细说了。分别测试有状态的会话Bean和无状态的会话Bean。
1、创建java项目(略)
2、修改环境,需要添加jar包。(jboss安装包里根目录里面client里面的所有jar包)
客户端代码
//测试有状态的会话Bean
public class StatefulEjbClient {
public static void main(String[] args) throws NamingException {
//第一次会话
InitialContext context = new InitialContext();
StatefulEjb ejb1= (StatefulEjb) context.lookup("StatefulEjbBean/remote");
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
//第二次会话
StatefulEjb ejb2= (StatefulEjb) context.lookup("StatefulEjbBean/remote");
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
}
}
测试结果:
有状态的会话Bean测试结果
//测试无状态的会话Bean
public class StatelessEjbClient {
public static void main(String[] args) throws NamingException {
//第一次会话
InitialContext context = new InitialContext();
StatelessEjb ejb1= (StatelessEjb) context.lookup("StatelessEjbBean/remote");
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
//第二次会话
StatelessEjb ejb2= (StatelessEjb) context.lookup("StatelessEjbBean/remote");
System.out.println(ejb2.getResult());
ejb1.compute(1);
System.out.println(ejb2.getResult());
ejb1.compute(1);
System.out.println(ejb2.getResult());
ejb1.compute(1);
System.out.println(ejb2.getResult());
ejb1.compute(1);
System.out.println(ejb2.getResult());
}
}
测试结果:
无状态的会话Bean测试结果
对比上述的两个结果:
有状态的会话Bean,每一个会话 都是一个新的开始。而无状态的会话Bean 每个会话用的时候都会接着用上一次的会话。
有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。
无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。

⑵ 消息驱动的Bean和无状态的会话Bean有什么区别

在这里先谢谢了
MDB是通过JMS消息驱动的,当消息队列中有消息时,将会引发MDB的onMessage方法调用版,而这些JMS消息可能来自于权各种消息生产者,比如POJO、其他消息中间件、EJB等,本实例使用无状态会话Bean发送JMS消息。

本实例的平台为:netbeans6.7.1 + jdk1.6 + Glassfish2.1 + JSF1.2

实现流程是:通过将jsp页面表单中输入的文本消息,发送给JSF后台受管BEAN,受管BEAN再以文本消息作为参数调用会话Bean,会话Bean将文本消息打包成TextMessage发送到消息队列(消息目的地)当中。消息队列再驱动MDB对消息进行处理,并打印处理。

⑶ 有状态会话Bean与无状态会话Bean的区别

有状态和无状态会话bean的本质区别是它们的生命期。

首先解释一个下面要用到的概专念--用户:session bean 的用户实际上就是属直接调用ejb的类的实例,甚至是这个实例的某个方法。同一个类的不同实例对于session bean 来说是不同的用户。

有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。

无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。

⑷ Spring中到底什么叫有无状态的Bean,什么叫

Bean 就是Java类没有什么好说的
有无状态 是说 Java类中如果用户第一次访问后改变的状态
是否可以在将来的多次访问时继续可以保持(这个状态是由Bean自已来维护)

⑸ EJB3 无状态会话bean代理存根对象 多线程安全吗

ejbs are thread safe, but stateless session beans are not suitable for storing session/conversational data. since the ejb container (jee server) might choose any instance in the pool to serve client request. that's why it's called "stateless".

if you need to store session/conversational state, ie, you need to save state between multiple pages, you might wanna use the http session object or stateful session bean instead.

⑹ sessionbean可以是有状态的也可以是无状态,这个状态是什么意思

ejb容器存储stateless
session
bean,这些bean可能是pre-created的,正由于stateless,每次函数调用容器会认为与上下文无专关所以是动态reassign一个属bean的实体给客户端使用,换句话说stateless里面request的level是per-method
至于debug为什么是有规律的,可能和jpda的结构和机制有关,我就不太清楚了
初学乍练请多指教

⑺ EJb中有状态会话构件和无状态会话构件

时间功能用无状态会话bean,购物车用有状态会话bean。(不过现在很多网站类程序都不在EJB端用有状态会话bean而是在Web端用HTTPsession保存状态)。


状态这个词汇在EJB中是指,我们是否期望服务器允许这个bean保存有状态值,因为EJB是启用了池化特性的,因此一大堆闲置的bean放在池中时它的状态有没有必要保存,因为当它下次为另一个用户的请求服务时这些东西会产生影响结果的可能性。


因此在有状态会话bean是允许这个EJB实现类有些非静态的字段成员,并且在ejbCreate/ejbRemove时会初始化或清理状态值,另外在我们从客户端lookup并home.create之后的所有对于这个home.create产生的对象stub1的请求都将在服务器端也被同一个bean实例处理(因为它可能缓存有上一次请求时留下的状态值),当然,当我们调用home.create得到另一个客户端stub2对象时它在服务器端对应的bean实例可能跟前一次不同但也可以跟你第一次home.create那个stub1是相同的(主要是看你是否已经对第一个stub1调用了remove方法,调用了remove那表示它的生命周期结束,后面的stub2可能依然在服务器端得到与stub1时相同的实例,因为stub1请求已经完成后服务器端对应的bean实例回到池中等待重用)。像购物车需要记住车内有什么物品,这就是”状态“,在你连续的多次发起添加物品,修改数量和结算请求时需要保持状态的一致性(我们不能看到别人的购物车的信息)。


ShopHomehome=//...context.lookup(...);
Shopstub1=home.create();
stub1.addProct(proct1);
stub1.addProct(proct2);
stub1.removeProct(proct1);

Shopstub2=home.create();
stub2.addProct(proct1);

stub1.pay();
stub1.remove();

Shopstub3=home.create();
stub3.addProct(proct4);
//在stub1.remove();之后stub3可能在服务端是用stub1当时相同的bean实例来服务的,因为stub1请求已经完成了。但stub2还没有完成因此stub3和stub2在服务端对应的bean肯定不相同,在stub1.remove()之前stub1和stub2在服务端对应的bean实例也肯定不相同,因此上面这段代码要求服务器上的EJB缓冲池中至少有2个ShopEJB的实例,这点服务器是绝对保证遵守规范的。


对于无状态会话bean来说,它就是完全不需要照顾这些,它的ejbCreate和ejbRemove这些方法也是完全没有意义的,不产生任何实际作用,也不需要被服务器调用的。


技术性的方面,当我们故意在服务端代码中无条件地抛也一个runtimeexception不处理它,我们在服务器的exceptionstacktrace中也能看出无状态和有状态的区别,因为服务器对于有状态会话bean需要记住是哪个连接请求的标记,比如客户端TCP地址和端口及一个内部唯一性的编号,而对于无状态会话bean来说,不用区分这些,因此,有些服务器(比如像WebSphere)为无状态会话bean提供一个ShareContext的选项,意思就是说既然无状态那么应该是线程绝对安全的所以我们不需要多个池化的实例而只需要在服务器上生成唯一一个实例放入池中就可以了。

⑻ 什么时候用有状态session bean,什么时候用无状态session bean

1.使用stateless bean,EJB容器能容易的pooling和重用bean,
允许少量的bean去服务很多客户端。用stateful bean去做同样
的事情时,bean的状态在方法调用之间必需要钝化和活化,可
能导致I/O瓶颈。所以无状态的一个实际的好处是使用很小的
开销来容易的pool和重用组件。

2.因为一个stateful session bean在内存中缓冲一个客户端
的对话,一个bean失败可能导致失去你的对话。这能导致严重
的反响,如果你不在写bean时考虑到这一点,或者你不使用一
个提供有状态恢复的EJB产品。在一个无状态模型里面,请求
能被透明的重路由到一个不同的组件,因为任何组件都能为
客户端的需要提供服务。

最大的无状态的缺点是你需要在每个方法调用中把客户相关的
的数据推到stateless bean。大多数stateless session bean
将需要接收对一个客户端特定的一些信息,如对banking bean的
银行帐户号码。这些信息要每次一个客户端请求到达时被提供到
stateless bean,因为bean不能对一个特定的客户端保持状态。

一种向bean提供客户相关的数据的方法是把数据作为参数传到
bean的方法中。这可能导致性能下降,然而,只是发生在传递的
数据量很大的情况下。这也阻塞了网络,降低了其他进程的带宽。

另一种为stateless bean提供客户相关的数据的方法,为那个
bean为一个客户端持久性的存储数据。客户端不需要在一个方法
调用中传递所有的状态,而只简单的需要从持久化的storage得到
数据。这里的trade-off又是性能:存储对话持久化的能得到存储
I/O瓶颈,而不是网络I/O瓶颈。

⑼ weblogic10.3中开发EJB3的无状态会话Bean的问题

取错了ejb的jndi 你所看到的这个自动部署的ejb不是你代码实例的ejb 重启bea并进入 新的jndi树应类似如下

⑽ 如何部署无状态会话bean的部署方法

首先,我们看一复下下面这制张图片,了解一下通过远程调用接口的过程,从而知道远程调用接口和本地调用的区别,从而能够更好的 根据不同的情况而不同的方式调用EJB。 前面我们已经说了怎么开发远程调用的无状态的会话bean,所以现在我们就讲一下本地...