设计美好的服务器II--站在JBoss MicroKernel上
??? 原文地址:http://blog.csdn.net/calvinxiu/archive/2007/05/30/1631693.aspx,版权所有,转载请保留原文链接,谢谢。--江南白衣
???? 一个Java World的业务处理服务器,总会遇上JNDI/JMX/JMS/JTA/Web Service/RMI/Corba/EJB/Clustering 这些JavaEE规范。大家可以依着Java开源社区的繁盛,以JDK+开源实现来拼凑遇到的规范,Geromino就是这样成就了大业。也可以像传说中一些欧洲电信公司那样,将服务引擎建在JBoss之上,需要的构件直接上JBoss套装,自己则专心于核心业务处理引擎的雕琢。
????应用服务器所接受的标准部署有Web、EJB、JCA三种。Web与EJB显然不合适,Mule、Apache CXF所用的JCA模式,自己天资所限总是看不明白。所以也像欧洲那些电信公司那样,在JBoss MicroKernel上编写自己的Service。
??? JBoss文档中有一章编写Custom Service教程,而JBoss里的每一个部件,几乎都是编写Service的Example,比如JNDI NamingService。
一、JBoss的JMX MicroKernel架构
?? 说起Kernel,Container,现在的人类总会想起Spring。两者的配置文件相若,如果说Spring Container的核心是用一个Singleton的HashMap装载所有受管理Bean,MicroKernel则是用一个JMX MBeanServer。
?? MicroKernel 中一切对象都可供JMX客户端管理--JMX简直是服务器程序恩物。但是JMX标准本身没有定义依赖管理,谁依赖谁,把谁注入谁,谁要在谁之前初始化,而且Java本身的生命周期函数也只有构造函数一途,连个释构函数都没有。所以MicroKernel也类似于Spring Container,在JMX的基础上,提供了依赖管理、依赖注入和生命周期管理的功能。
???自己乱搞之前,先看一下JBoss的架构;
?? 1./lib 放着少量的公共jar,/server下三个目录是三种预启动配置,JBoss是完全基于MicroKernel模块化的,所以minial是仅有JNDI功能的微内核,default是单机server所需的服务,而full加上群集的功能。大家可以在三种基础上随意增减。
?? 2.在bin下运行run -c minimal,启动微内核示例。
???3.根据StartUp Process?的描述,配合源码很容易将把启动过程搞懂。(BTW,大部分人读源码最有动力的的时间都是看启动过程那段)
?? 4.看一下minimal 目录,deploy目录为空,代表没有额外部署的Service。再看一下/conf下的jboss-service.xml,定义了Log4jService,BasicThreadPool,NamingService,URLDeploymentScanner四个构件。
??? so 清晰,so 简单,然后,到我们自己了。
二、编写自己的Service
??? 这里只用最简单的方式介绍最简单的示例,使用注入的JBoss BasicThreadPool线程池,开一条啥都不做的线程。?
??? 1.HelloServiceMBean接口,定义了两个注入函数,JMX下类之间靠MBean暴露的接口打交道。
public?interface?HelloServiceMBean?extends?org.jboss.system.ServiceMBean{????public?void?setServiceName(String?serviceName);
????public?void?setThreadPool(BasicThreadPoolMBean?poolMBean);
}
?
??? 2.HelloService类,实现HelloServiceMbean接口,继承于JBoss提供的便利类ServiceMBeanSupport,只需重载startService()和stopService()两个函数。
????startService()函数使用继承的logger打印注入的serviceName,使用注入的threadPool开一条工作线程,由于没有什么系统资源需要归还清理,所以stopService()函数走空。
import?org.jboss.util.threadpool.BasicThreadPoolMBean;
import?org.jboss.util.threadpool.ThreadPool;
public?class?HelloSimpleService?extends?ServiceMBeanSupport?implements
????????HelloServiceMBean?{
????private?String?serviceName;
????private?ThreadPool?threadPool;
????public?void?setServiceName(String?jndiName)?{
????????this.serviceName?=?jndiName;
????}
????
????public?void?setThreadPool(BasicThreadPoolMBean?poolMBean)?{
????????threadPool?=?poolMBean.getInstance();
????}
????public?void?startService()?throws?Exception?{
????????log.info("Starting?"?+?serviceName);
????????threadPool.run(new?HelloThread());
????}
????public?void?stopService()?{
????????log.info("Stoping?"?+?serviceName);
????}
????private?class?HelloThread?implements?Runnable?{
????????public?void?run()?{
????????????log.info("Hello?Thread?Start....");
????????????for(;;){
????????????????
????????????}
????????}
????}
}
?
??? 3.hello-service.xml,典型的Bean配置文件,注意ServiceName,ThreadPool要很土的首字母大写。
<server>
????<mbean?code="HelloService"?
???????????name="hello:service=HelloService">
????????<attribute?name="ServiceName">HelloWorldServiceattribute>
????????<depends?optional-attribute-name="ThreadPool"
?????????proxy-type="attribute">jboss.system:service=ThreadPooldepends>
????mbean>
server>?
??? 好,现在把两个java文件编译打包成jar, 和hello-service.xml一起放入minimal/deploy 目录就会被hot depoy,jboss的屏幕上就能看到"Starting HelloWorldService字样"。
? 后来又试了下使用JBoss的JNP Naming Service,注册了一个HelloWorld的RMI服务,在客户端调用之。但如何深入应用JBoss的其他组件还需要研究....?
参考资料:
JBoss Wiki--JBoss Microkernel? JBoss Wiki--JBoss Services系列文章:
设计一个美好的服务器--MINA、CXF、Mule、JBoss/Geronimo?设计美好的服务器II--站在JBoss MicroKernel上?轻的,谁都会写的Service方案--REST与JSON??
1 楼 shaucle 2007-06-19 下面是一些个人看法.一般服务器都会提供一个kernel,插件会基于这个kernel
实际插件是通过向kernel注册模块,(如这些模块在JBoss里是MBean,在Geronimo里是GBean)
模块间有dependency,并由kernel管理lifecycle和调度等,(Geronimo还可以对kernel进行persist)
服务器基于这些,再提供如部署方案(热部署),存储库(部署目录),控制台等.
一下子只想到这些.. 2 楼 江南白衣 2007-06-20 Geronimo又拿一个Milestone版过了JavaEE5了。
jboss 5 vs Geronimo 2 vs glassfish, 到底哪个better呢。
业界好像没什么人做对比。 3 楼 shaucle 2007-06-20 "业界好像没什么人做对比"
说明技术很新或很前沿?
楼主自己写个对比? 4 楼 cctvx1 2007-06-21 主要是现在的大客户并不care opensource带来的好处
相反他们更希望得到很好的服务
但是这个绝对是opensource的致命问题
你让网银,电信,移动 在核心平台上面用opensource的基础平台
简直不太可能的。
因此这些关注主要来源于开发者,但是开发者往往又没有话语权
所以导致很多仅仅停留在技术成面
比如国外著名的几个咨询公司做得比较都没有opensource的应用。 5 楼 cxj_2000 2007-06-22 楼猪能不能给个jboss microkernel的download地址?
谢谢,我在jboss上面找了半天都没有,郁闷。 6 楼 cxj_2000 2007-06-22 cctvx1 写道主要是现在的大客户并不care opensource带来的好处 相反他们更希望得到很好的服务 但是这个绝对是opensource的致命问题 你让网银,电信,移动 在核心平台上面用opensource的基础平台 简直不太可能的。 因此这些关注主要来源于开发者,但是开发者往往又没有话语权 所以导致很多仅仅停留在技术成面 比如国外著名的几个咨询公司做得比较都没有opensource的应用。<br/>
<br/>
spring在这些用户里面有的,还有struts,呵呵。<br/>
<br/>
太平人寿上海他们就用spring。 7 楼 firelife 2007-06-22 为什么不考虑osgi架构,现在IBM开发工具和服务器都是基于osgi的了