设计美好的服务器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.system.ServiceMBeanSupport;
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要很土的首字母大写。

<? xml version = " 1.0 "  encoding = " UTF-8 " ?>
< server >
    
< mbean code = " HelloService "  
           name
= " hello:service=HelloService " >
        
< attribute name = " ServiceName " > HelloWorldService </ attribute >
        
< depends optional - attribute - name = " ThreadPool "
         proxy
- type = " attribute " > jboss.system:service = ThreadPool </ depends >
    
</ mbean >
</ server >  

    好,现在把两个java文件编译打包成jar, 和hello-service.xml一起放入minimal/deploy 目录就会被hot depoy,jboss的屏幕上就能看到"Starting HelloWorldService字样"。

  后来又试了下使用JBoss的JNP Naming Service,注册了一个HelloWorld的RMI服务,在客户端调用之。但如何深入应用JBoss的其他组件还需要研究.... 

参考资料:

设计美好的服务器系列文章:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值