在Stateless Session Bean中启动一新线程这种做法好不好? 不知道你的Session Bean用来做什么?如果是大量的计算,难道你就可以直接返回?如果那样的话,怎么知道是否操作成功? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有一个专门的Java Class(extend Thread)用来进行计算,在Stateless Session Bean里面只是实例化该类,传递参数,启动该线程,Session Bean不参与计算,当然可以直接返回.当然操作结果要通过某些途径返回给用户.我现在最想知道的就是这种方法的弊端. Stateless session bean应该不会是同时只允许一个实例运行的。哪怕容器的确只实例化一个bean instance,但也允许多个request同时执行里面的方法吧。 EJB Container会维持一个实例池,当一个客户端需要Stateless Session Bean提供服务时,EJB Container会分配一个Bean实例给客户端,一个bean instance只能对应一个client,不象Servlet container维持一个线程池,当一个http request发送来时,分配一个thread,Servlet只有一个instance,所以允许多个request同时执行里面的方法,但EJB不一样.假如Stateless Session Bean instance长期被占用,当有大量用户访问(并发)时,系统就可能出现性能严重下降或者崩溃. 楼主,我没有理解你的这句话:所以我采用了在Stateless Session Bean启动一新线程计算呵呵如何启动??? 可能我写的不够严密.整个过程是这样的:首先写一个类(extend Thread),该类的主要任务就是计算并且有一个启动函数用于启动自身线程,在Stateless Session Bean创建该类的对象,再调用这个启动函数. 规范里说stateless session bean的一个instance支持多个client请求的,你可以试一下。我认为不开新线程也不会因此阻塞其他用户,因为多个request本来就是在不同的线程里调用bean,而这个bean的方法也不是synchronized的。不过启动新线程的可以让方法立即返回,实现异步调用,提高程序响应速度(能通过其他途径返回结果的前提下) EJB中禁止使用任何与线程相关的代码。syncronized关键字、启动新线程的操作都在禁止之列。在EJB中操作线程会降低EJB容器正确管理运行时环境的能力,有可能造成无法预知的结果。楼上allanic(阿伦)还煞有介事地在这回答,你到底有没有用过EJB? to Schlemiel(维特根斯坦的扇子)nod建议楼主读一下EJB规范 EJB中禁止使用任何与线程相关的代码,但实际上也可以进行多线程编程,如果直接在Session Bean函数里调用start()当然不行,但通过间接的手段却可以,比如在多线程类中定义一个函数,public void startComputing() { this.start();}然后在Session Bean中创建多线程类的对象,再调用startComputing()就可以了。假如不用多线程,那又怎么解决长时间计算导致Stateless Session Bean instance无法重用的问题。 to Schlemiel(维特根斯坦的扇子):我知道你是高手,请多指点。to raimundo():EJB规范那么多页,我也不好找,你能不能把相关的那几页贴出来。 spring怎么获得properties文件里面的数据? session 问题 简单 在jsf中怎么控制文本框的中文输入长度? tomcat client deployer 求例子文件 struts编写的B/S程序使用tomcat做服务器有时会无法访问????急!!!! 向高手请教一个CVS的问题,麻烦帮我解决一下 菜鸟请教:关于tomcat 关于在jboss下配置跳转页面(散分100) 文件下载的问题 hibernate 问题,急!! 在JBOSS中发布一个servlet程序,servlet的log用log4j来实现出现问题!求解 一个小错误的解释,马上结分
假如Stateless Session Bean instance长期被占用,当有大量用户访问(并发)时,系统就可能出现性能严重下降或者崩溃.
所以我采用了在Stateless Session Bean启动一新线程计算
呵呵
如何启动???
整个过程是这样的:首先写一个类(extend Thread),该类的主要任务就是计算并且有一个启动函数用于启动自身线程,在Stateless Session Bean创建该类的对象,再调用这个启动函数.
public void startComputing() {
this.start();
}
然后在Session Bean中创建多线程类的对象,再调用startComputing()就可以了。假如不用多线程,那又怎么解决长时间计算导致Stateless Session Bean instance无法重用的问题。
to Schlemiel(维特根斯坦的扇子):
我知道你是高手,请多指点。
to raimundo():
EJB规范那么多页,我也不好找,你能不能把相关的那几页贴出来。