一些J2EE实施的问题

初学J2EE功力不深,看了白皮书和Tutorial后,觉得有些实际问题似乎和理论会有冲突
1.servlet,sessionbean(sbean),entitybean(ebean)之间的关系:是否可以这样认为,servlet只是控制转发jsp的请求(一般用rmi调用sbean的业务),sbean实现复杂业务逻辑(一般提供remote接口),ebean实现db的table增.删.改(一般由sbean调用只实现local接口),可多数情况webserver和ejbserver在一个进程里(sbean只需暴露local接口就可以了?),一些业务只是db的增删改(servlet就可以直调ebean了(可以local也可以remote调用),这种情况就根本不需要sbean了?)

2.ejb容器会跟据sbean的并发情况自动产生实例,这些多实例是否各起自己的线程?那是否我们的sbean实现的业务逻辑都可以不考虑线程的问题了?这种情况下容器会维护好sbean对象的线程外的公共对象吗?

3.什么情况下需要自己写jmx的mbean?jboss或weblogic似乎不提倡自己写mbean?

4.jboss和weblogic结合jbuild开发大的应用,如何实现团队管理,在开发阶段似乎写好的ejb只能部署到本机,不需要每个人都装个weblogic才能进行开发调试吧?

5.开发完以后安装程序怎么做?虽然在开发阶段部署新的ejb很容易,但不能在用户现场去部署和作很多配置工作吧,是装好weblogic后覆盖自己的配置文件?用户一般只希望点一个setup就完事最好了

6.还有一些问题继续在想,请大家讨论

1.一开始大家都这么认为,实际上,从性能角度考虑,正好相反,sbean性能要好。可以在sbean+DAO来操作数据库


2. 看看我的J2EE到底是什么文章,EJB容器只起对象池,Servlet容器是线程池。这样,不用考虑线程或对象池的问题

3.mbean是Jboss平台服务器内部模块,除非你想定制你自己的J2EE服务器。

4.可以部署到本机的jboss服务器,也可以部署到总的服务器上。

5.开发以后,使用ant这样工具实现打包,实际每天你都可以实现项目集成,然后运行系统的自动测试程序,以确保每个人的修改没有无法运行的大bug.

还是开发合作的问题,用jbuilder有没有什么好的方法实现集成?

现在我们的做法是做成remote的接口,每个人登陆到那个人的机器上调试。

可是最后remote会换成local,有没有什么好的方法。

我感觉不好使用Jbuiler。

所有人开发的代码都check in到CVS 服务器上,使用ant编制一个脚本,将这些EJB打包成一个ear文件,然后自动发布。
再启动系统测试程序,对这个系统进行自动测试,这种工作通常是在晚上作,第二天,程序员打开电脑,会看到昨天项目集成测试后的结果,谁更改,造成哪些错误,都可以查询到。

这也是项目的持续集成吧。

感谢banq兄回复
1.sbean+ADO效率高,是和servlet直调ebean远程接口比?这里的ADO是类似JDO吗的O-R封装吗

2.servlet调sbean的线程问题:banq是说只要在业务调用时考虑线程问题就可以了?事实上业务处理(SBean)部分要关注的线程问题更多阿,比如一个servlet向sbean一次发送100个客户ID,要求sbean为每个客户发送一封mail,通常处理应该是在这个sbean里new出n个线程处理这100个队列,如果光靠servlet触发只会生成一个sbean实例吧,此时效率怎能保证呢?

3.有些业务是作为一种服务存在的,比如是一个SocketCLient(接收非java数据源不能用JMS),这个服务接收到的数据会放入一个队列,由这个队列触发消息处理线程,这种情况SocketClient是不是适合作成mbean而不是sBean呢?处理队列的业务倒是可以做成sbean

4.在jbuild里好像是可以部署到远程jboss,但前提好像是先要在本机上配好j2eeServer,部署功能才会被激活!

5.banq的意思是在用户环境里先安装标准版j2ee服务器,再执行一下ant发布自己的ear等,还可以同时修改j2ee的若干配置xml?

谢谢!


那一定需要很好的设计吧。

调试怎么解决呢?每改一点,都需要重新部署么?

1.是这样,是DAO,DAO就是直接JDBC调用。O-R封装要再上一层。

2.sbean是个对象池,无态bean已经在容器启动时生成很多数量的实例,因此servlet的100个线程来访问时,从对象池取一个实例为每个线程服务,当并发数量降低时,对象池的sbean实例会降低到最小。当然并发线程不能超过对象池最大实例数,否则性能就大幅度降低。

3.如果能Sbean,应该能用JMS,如下图:

socketclient接受到数据后,如图左边是加入Queue,而另外一段是取数据,这是个典型的消息处理模型,左边使用sbean实施,而右边取出使用MDB(Message-Driven Beans),中间队列Queue可以交给JMS的。
其实JMS也可以使用在非EJB环境,如果不能使用JMS,正如你说的,右边必须是一个线程啊,sbean不是线程。

4.jbuilder可以部署远程。
持续集成是基于CVS服务器的,因为所有程序员编码在自己机器单元测试ok后,都要check in(上传)到总的CVS服务器上,ant脚本定时从cvs服务器上取出最新版本,因为EJB是组件式的,没有EJB有自己的ejb-jar.xml,只要将这些EJB组件打包在一个ear文件中,它们之间就可以互相调用了,实际是完成各个程序员功能模块的集成。

然后脚本可以启动应用系统测试程序,其实这不难编写,因为j2ee已经将界面和功能分开,所以只要抛开界面,直接针对功能测试,这是整合测试。这样避免单元测试通过后,整合测试失败的现象。

我对第四个问题是深有体会啊,我现在的公司做的项目就是每个开发人员的电脑上安装了jbuilder和weblogic,所以运行起来速度很慢。SCM用的是CVS。

楼主的第四个问题我比较关注。
我认为不应该是每台机器都配制成EJB Container,这样做虽然从性能上有诸多好处,但缺点也是很明显的。每台机器都装个运行EJB的server,对机器配置要求很高,这样成本就高。但最关键的是,这样做没有体现出EJB的分布式应用带来的好处。
应该的做法是:只用一台机器配置成EJB的容器,使EJB在其上运行,其他机器只需装resin,Tomcat等普通的jsp,servlet容器,使其调用EJB server上的组建或方法,当然这些servlet容器要有EJB的远程接口,这样的做法应该是比较合理。
个人意见。

读这个帖子有收获:高效的集成测试--通过ANT自动checkout、自动编译部署、自动启动测试类,ANT真好,谢谢banq!

关于开发过程中的部署问题,我们的做法是各人将整个应用部署到本机的WLS上面,这样比共用WLS方便,当然,这需要更多的MONEY去买足够的内存。我们现在每人的机器都配了1G的内存,同时打开WLS和IDEA还能剩下300兆左右,还行。

每台机器都配置成1G(服务器)的内存?
如果再加上每台机器双CPU,那的却可以解决不少技术上的问题

如果内存没涨价的话,1G内存真的并不遥远啊。

请问哪里有WLS(我说的是 Weblogic Exam Simulator,Weblogic模拟器,而不是Weblogic本身)的liecens

介绍一个实现持续集成的开源软件:
http://cruisecontrol.sourceforge.net/

它是建立在理论:
http://www.martinfowler.com/articles/continuousIntegration.html

特点:
Build Loop
C A java daemon process that wakes up byschedule.
C A true ant wrapper (v2.x) with its own xmlconfiguration file.
C Pluggable Architecture (v2.x)
C Supports all major source control (CVS,ClearCase, VSS, StartTeam, …).


引用:

3.mbean是Jboss平台服务器内部模块,除非你想定制你自己的J2EE服务器。

MBean是JMX里规范的管理界面,是j2ee 1.4的标准规范之一(同时有个扩展,j2ee management),本意是提供统一的服务管理机制,但是由于出色的lifecyle设计,和简单易用的特性,jmx已经越来越多扮演了Service Platform的角色了。很多系统都是架构在jmx之上的,比如jBoss。说mbean是JBoss的内部模块,我不是很认同,定制j2ee服务器,就更不同意了。通过mBean,我们自己的EJB可以在management console里统一管理,并不是定制j2ee server的问题。

btw:JBoss和WebLogic对JMX并不是很开放,想实现MBean需要很多vendor specified的支持,不很通用,而webSphere作mbean就容易些。