(300分送)ejb中能不能使用线程,网络类?

wuyg719 2003-12-12 12:13:55
解决问题 300分相送,决不食言!!

我在一本ejb书上和网上看到:
ejb不能(1)管理或同步化线程
(2)使用部分套接字函数

可是我为了实现一些自动化的任务,使用了线程,用一个JSP去启动和停止这个线程。在Tomcat,Jboss上这个模式运行很正常,换成正式的服务器
Iplanet6.5也是正常的,但不幸的是由于某些原因,Iplanet6.5启动了4个KJS
我也不明白为什么要启动4个KJS,我理解是好像是四个JVM环境。
这样一搞我的程序就出错了,感觉原来启动一个线程变成了四个互相不知道的线程
,我也试着在启动线程之前,检测是否有其他线程在运行,但根本就检测不到
这也是正常的,因为是四个JVM,当然不能检测到。
四个互相不知道的线程,想想也知道程序会出什么乱子,Synchorize也没有用。
我的自动化的任务有:定期发电子邮件,定期生成报表文件(PDF)等。
以前还有数据上的自动任务,我已经移动到数据库的Job里去了。
程序做到这个程度,不可能重写吧?

各位救救我。

...全文
31 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyg719 2003-12-17
  • 打赏
  • 举报
回复
to simonhappy:
感谢你的支持,在你的帮助下,我想通了一些东西,可惜现在没有机会试了。

我理解是servlet是在一个多线程的环境下,因此一定要synchronized。
我想可能我的程序处理不够成熟,实际在Servlet中启动线程应该是没有问题的。

我将实现我的诺言,将发两个贴给你接分,这个贴将感谢其他帮助我的好同志。
wuyg719 2003-12-16
  • 打赏
  • 举报
回复
如何写一个控制类,能否给个简单例子。
simonhappy 2003-12-16
  • 打赏
  • 举报
回复
public class ThreadMng {
private MyThread t ;
static private ThreadMng mng;
private ThreadMng() {
t = new MyThread();
}
static synchronized public ThreadMng getInstance(){
if(mng==null){
mng = new ThreadMng();
}
return mng;
}
public synchronized void startThread(){
if(!t.isAlive()) {
t.start();
}
}
public synchronized void stopThread(){
if(t.isAlive()) {
t.shutdown();
//注意shutdown需要保证关联资源的释放.
}
}}
wuyg719 2003-12-15
  • 打赏
  • 举报
回复
问题的焦点是如何实现定时处理。
simonhappy 2003-12-15
  • 打赏
  • 举报
回复
看了wuyg的叙述,感觉KJS是一个类似于servlet容器的东西,通常只有一个servlet容器,那么我们的servlet示例应该只有一个,如果开4个,就会有4个servlet实例,应该可以提高页面的响应速度.
如果是一个没问题,4个有问题,应该是代码控制并发的问题.你一定是将控制并发的代码写入了servlet中.建议把控制线程的代码从servlet中取出,放入其他类中管理,应该可以解决这个问题.
simonhappy 2003-12-15
  • 打赏
  • 举报
回复
一个线程类,复杂定时处理.
一个控制类,同步启动线程类的方法,保证线程实例唯一.
Servlet中调用控制类启动线程.
wuyg719 2003-12-13
  • 打赏
  • 举报
回复
to pleonheart: 要能用线程我就不发这个贴了.
当然用一个Application不关机去处理自动任务,通过数据库与b/s交换数据也能实现,
但我的Application就必须安装一大堆j2ee里的jar,还搞出两个环境,以后很难管理。
pleonheart 2003-12-13
  • 打赏
  • 举报
回复
一个线程调用EJB不就好了
dreamnear 2003-12-13
  • 打赏
  • 举报
回复
楼主为什么要在EJB里用多线呢?这和EJB所要实现的功能有很大的出入啊。建议楼主把多线那一块挪到调用EJB的时候去做,这样不就解决了?
wuyg719 2003-12-13
  • 打赏
  • 举报
回复
各位瞎扯,EJB不允许自己去管理线程,由容器管理线程

如何实现定时?
yeshucheng 2003-12-13
  • 打赏
  • 举报
回复
楼主要走入误区了!!
上边的那位说对了,EJB本身就支持多线成的!!
通过用CMP来管理!!!所以建议去了解一下EJB
simonhappy 2003-12-12
  • 打赏
  • 举报
回复
通常都是强烈不建议在Bean使用线程.因为服务器本身基于Bean处理并发,事务等.如果Bean自己处理多线程,如何服务器都难以保证正确的处理并发问题.而且对于Bean中线程,不同的容器处理的规则也不统一(不是J2ee规范要求).
你的麻烦大了.
wuyg719 2003-12-12
  • 打赏
  • 举报
回复
难道各位大侠开发的系统不需要自动任务?能否讲讲各自的经验?
wuyg719 2003-12-12
  • 打赏
  • 举报
回复
我想了一些方法来判断是否有多个线程在运行,其中一种是通过
ThreadGroup去找是否有某个名称的线程,应该没有问题。

to lifetragedy:JMS能定期生成报表文件(PDF)吗?
JMX是什么东西的缩写?没有听说过,能否介绍一下。

to QQHelloWorld : mdb是什么东西的缩写?
to blueye11: EJB仅仅是J2ee的一部分,不是必须的部分,
在Tomcat上跑的系统均没有EJB,难道不能配置?

此外说一句:4个KJS是他们的SUN顾问建议他们这样用,缺省情况
只用一个KJS,我的程序也不会出问题。
blueye11 2003-12-12
  • 打赏
  • 举报
回复
哥们,一台机器只可以启动一个JVM啊,所以KJS不等同于JVM,什么叫你的系统里面没有EJB,那你如何进行配置的呢,不懂.....
EJB是不可以进行线程管理的,因为EJB的生命周期是由EJB容器进行掌管,而EJB在被销毁的时候还在管理着线程,很容易就把程序搞崩了..
QQHelloWorld 2003-12-12
  • 打赏
  • 举报
回复
对,用mdb肯定是可以解决问题的
TGITCIC 2003-12-12
  • 打赏
  • 举报
回复
我想说的你的问题是可以解决的
怎么解决:
JMX,可以实现自动化无人管理
仔细学学JMS,不要再说在EJB里用线程什么的无厘头的问题的
simonhappy 2003-12-12
  • 打赏
  • 举报
回复
我不了解Iplanet和KJS,但是感觉KJS不可能等同于JVM,否则只有想办法JVM之间的通讯了,而且你的问题除了限制只有一个KJS外,用其他方法解决会很麻烦.感觉你的意思是启动线程定时执行任务,值个被启动的线程应该是个singleton对象,你是否没有作这个限制?或者你用Servlet中属性来判断线程是否启动了?.
wuyg719 2003-12-12
  • 打赏
  • 举报
回复
我的系统根本没有用EJB,我是直接在在servlet中启动线程的,
可是正式运行环境只有Iplanet。
simonhappy 2003-12-12
  • 打赏
  • 举报
回复
为什么写在Bean中,写在Servlet中不行吗?在Webserver实现就可以了.
加载更多回复(2)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧