原文地址: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暴露的接口打交道。
publicinterfaceHelloServiceMBeanextendsorg.jboss.system.ServiceMBean{
publicvoidsetServiceName(StringserviceName);
publicvoidsetThreadPool(BasicThreadPoolMBeanpoolMBean);
}
2.HelloService类,实现HelloServiceMbean接口,继承于JBoss提供的便利类ServiceMBeanSupport,只需重载startService()和stopService()两个函数。
startService()函数使用继承的logger打印注入的serviceName,使用注入的threadPool开一条工作线程,由于没有什么系统资源需要归还清理,所以stopService()函数走空。
importorg.jboss.system.ServiceMBeanSupport;
importorg.jboss.util.threadpool.BasicThreadPoolMBean;
importorg.jboss.util.threadpool.ThreadPool;
publicclassHelloSimpleServiceextendsServiceMBeanSupportimplements
HelloServiceMBean{
privateStringserviceName;
privateThreadPoolthreadPool;
publicvoidsetServiceName(StringjndiName){
this.serviceName=jndiName;
}
publicvoidsetThreadPool(BasicThreadPoolMBeanpoolMBean){
threadPool=poolMBean.getInstance();
}
publicvoidstartService()throwsException{
log.info("Starting"+serviceName);
threadPool.run(newHelloThread());
}
publicvoidstopService(){
log.info("Stoping"+serviceName);
}
privateclassHelloThreadimplementsRunnable{
publicvoidrun(){
log.info("HelloThreadStart....");
for(;;){
}
}
}
}
3.hello-service.xml,典型的Bean配置文件,注意ServiceName,ThreadPool要很土的首字母大写。
<?xmlversion="1.0"encoding="UTF-8"?>
<server>
<mbeancode="HelloService"
name="hello:service=HelloService">
<attributename="ServiceName">HelloWorldService</attribute>
<dependsoptional-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的其他组件还需要研究....
参考资料:
设计美好的服务器系列文章:
分享到:
相关推荐
JavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-...
java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object; 错误解决办法
2010-06-15-JBoss-AS-Deploying-WARs-with-the-DeploymentFileRepository-MBean.pdf
JavaEE源代码 jboss-jmxJavaEE源代码 jboss-jmxJavaEE源代码 jboss-jmxJavaEE源代码 jboss-jmxJavaEE源代码 jboss-jmxJavaEE源代码 jboss-jmxJavaEE源代码 jboss-jmxJavaEE源代码 jboss-jmxJavaEE源代码 jboss-...
cas-client-integration-jboss-3.2.0.jar
JavaEE源代码 jboss-cacheJavaEE源代码 jboss-cacheJavaEE源代码 jboss-cacheJavaEE源代码 jboss-cacheJavaEE源代码 jboss-cacheJavaEE源代码 jboss-cacheJavaEE源代码 jboss-cacheJavaEE源代码 jboss-cacheJavaEE源...
JavaEE源代码 jboss-systemJavaEE源代码 jboss-systemJavaEE源代码 jboss-systemJavaEE源代码 jboss-systemJavaEE源代码 jboss-systemJavaEE源代码 jboss-systemJavaEE源代码 jboss-systemJavaEE源代码 jboss-...
jboss jar包snowdrop-vfs.jar和jboss-logging.jar用于解决解决JBoss与Spring兼容的问题
JAVA-SERVLET-+-MYSQL-+-JBOSS-开发起步
赠送jar包:jboss-threads-3.1.0.Final.jar; 赠送原API文档:jboss-threads-3.1.0.Final-javadoc.jar; 赠送源代码:jboss-threads-3.1.0.Final-sources.jar; 赠送Maven依赖信息文件:jboss-threads-3.1.0.Final....
赠送jar包:jboss-annotations-api_1.3_spec-2.0.1.Final.jar; 赠送原API文档:jboss-annotations-api_1.3_spec-2.0.1.Final-javadoc.jar; 赠送源代码:jboss-annotations-api_1.3_spec-2.0.1.Final-sources.jar;...
CVE-2017-12149 JBOSS as 6.X反序列化(反弹shell版)
>jboss-parent</ artifactId > < version >33</ version > </ parent > pom 包含允许自定义各种构建配置的属性。 例如,要覆盖 maven-compiler-plugin 的默认版本,只需设置一个属性。 < properties ...
jbpm-3.2.6.SP1默认安装在jboss-4.2.3.GA下不支持Oracle,对配置文件进行修改,内有详细的文档说明。解压后直接将文件夹jbpm3覆盖到jboss-4.2.3.GA\server\default\deploy\jbpm,注意拷贝oracle的jdbc驱动到jboss-4.2.3...
jboss-eap-6.4.0.zip
赠送jar包:jboss-logging-3.3.2.Final.jar; 赠送原API文档:jboss-logging-3.3.2.Final-javadoc.jar; 赠送源代码:jboss-logging-3.3.2.Final-sources.jar; 赠送Maven依赖信息文件:jboss-logging-3.3.2.Final....
辛苦找了一天,跟大家分享一下jboss难找的jar包
有人向我要,所以传上来! 错误信息:java.lang.ClassNotFoundException: org.jboss.logging.BasicLogger 解决办法:加入jboss-logging-3.1.0.GA.jar就好了。hibernate4日志机制改了
JBossTools-ALL-win32-3.0.0.CR2-
jboss服务器配置文件说明,网上关于jboss配置文件说明