??xml version="1.0" encoding="utf-8" standalone="yes"?>
如自定义MBean服务依赖于其他MBean服务Q可以通过如下Ҏ实现Q?br />1、在自定义MBean接口中添加Service中Q何方法?br /> q种方式避免了对JBoss具体接口的依赖?br />2、ؓ自定义MBean接口扩展org.jboss.system.Service接口?br />
3、ؓ自定义MBean接口扩展org.jboss.system.ServiceMBean接口?br /> 最单的办法是将自定义MBean接口l承于ServiceMBean接口Q将MBean实现cȝ承ServiceMBeanSupportcRServiceMBeanSupport已经实现了ServiceMBean接口QServiceMBeanSupportq集成了日志、JBoss服务状态管理跟t功能,q些Ҏ需要我们具体实现createService、startService、stopService和destroyService中的部分Ҏ?br />
下面介绍ZServiceMBean接口和ServiceMBeanSupportcȝJNDIMapMBean接口及其JNDIMap实现cR?br />
package org.joss.chap2.ex2;
import javax.naming.NamingException;
import org.jboss.system.ServiceMBean;
public interface JNDIMapMBean extends ServiceMBean
{
public String getJndiName();
public void setJndiName(String jndiName) throws NamingException;
}
package org.joss.chap2.ex2;
import java.util.HashMap;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.naming.InitialContext;
import javax.naming.Name;
import javax.naming.NamingException;
import org.jboss.naming.NonSerializableFactory;
import org.jboss.system.ServiceMBeanSupport;
public class JNDIMap extends ServiceMBeanSupport implements JNDIMapMBean
{
private String jndiName;
private HashMap contextMap = new HashMap();
public JNDIMap()
{
super();
// TODO Auto-generated constructor stub
}
public String getJndiName()
{
return jndiName;
}
public void setJndiName(String jndiName) throws NamingException
{
String oldName = this.jndiName;
this.jndiName = jndiName;
if(super.getState()==STARTED)
{
unbind(oldName);
try
{
rebind();
}
catch(Exception e)
{
NamingException ne = new NamingException("Failed to update jndiName");
ne.setRootCause(e);
throw ne;
}
}
}
public void startService()throws Exception
{
rebind();
}
public void stopService()
{
unbind(jndiName);
}
private void rebind() throws NamingException
{
InitialContext rootCtx = new InitialContext();
Name fullName = rootCtx.getNameParser("").parse(jndiName);
NonSerializableFactory.rebind(fullName,contextMap,true);
}
private void unbind(String jndiName)
{
try
{
InitialContext rootCtx = new InitialContext();
rootCtx.unbind(jndiName);
NonSerializableFactory.unbind(jndiName);
}
catch(NamingException e)
{
System.out.println(e);
}
}
public String getName()
{
// TODO Auto-generated method stub
return null;
}
public int getState()
{
// TODO Auto-generated method stub
return 0;
}
public String getStateString()
{
// TODO Auto-generated method stub
return null;
}
public void jbossInternalLifecycle(String arg0) throws Exception
{
// TODO Auto-generated method stub
}
public void create() throws Exception
{
// TODO Auto-generated method stub
}
public void start() throws Exception
{
// TODO Auto-generated method stub
}
public void stop()
{
// TODO Auto-generated method stub
}
public void destroy()
{
// TODO Auto-generated method stub
}
public ObjectName preRegister(MBeanServer arg0, ObjectName arg1)
throws Exception
{
// TODO Auto-generated method stub
return null;
}
public void postRegister(Boolean arg0)
{
// TODO Auto-generated method stub
}
public void preDeregister() throws Exception
{
// TODO Auto-generated method stub
}
public void postDeregister()
{
// TODO Auto-generated method stub
}
}
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.joss.chap2.ex2.JNDIMap"
name="chap2.ex2:service=JNDIMap">
<attribute name="JndiName">inmemory/map/MapTest</attribute>
<depends>jboss:service=Naming</depends>
</mbean>
</server>
JBOSS 推出 3.0.4 版本其实已经很久很久啦,可是呢,|上关于它的介绍少得可怜,而且仅有的几介l都q不完全正确Q很多甚x直接拯 jboss2.4.4 的相兛_宏V那些抄袭者没有想刎ͼ?/span> jboss2.4.4 ?/span> jboss3.0.4 之间有很大的飞跃Q甚至目录结构也不相同了Q相关配|更不用多说Q他们那些拷贝来的作品根本不能正指gh们学?/span> jboss ?/span>
Z学习 jboss Q我惛_多数人可能都要从 http://www.jboss.org 那里下蝲其本w的文档Q如 3.x 版本有文档 JBoss.3.0QuickStart.Draft3.pdf 来进行入门指对{但是oZ万没有想到的是, JBoss.3.0QuickStart.Draft3.pdf 文档中甚至也有错误的地方Q完全按照它的指引,大家会走弯路的?/span>
因此Q结合我最q学?/span> jboss3.0.4 的经验,Ҏ实际应用情况Qȝ?/span> jboss3.0.4 配置及用初步文档,供大家参考和讨论?/span>
首先Q你必须安装?/span> JDK Q版本ؓ 1.3 以上Q我使用的是 1.4 版本。ƈ?/span> CLASSPATH 中设|?/span> JAVA_HOME 环境变量?/span> JDK 安装目录。确保在你的机器上可以运?/span> JAVA E序?/span>
?/span> jboss 自己的网?/span> http://www.jboss.org 下蝲 jboss3.0.4 Q有 jboss-3.0.4.zip ?/span> jboss-3.0.4_tomcat-4.1.12.zip 。后者是 jboss ?/span> tomcat 整合CL版本Q这里主要介l前者,既单独的 jboss3.0.4 ?/span>
jboss 的运行很单。将 jboss-3.0.4.zip 解压到本地硬盘的一个目录中。会有以下几个目录生成:
bin
攄 jboss 启动和停止的可执行脚本文?/span>
docs
攄 jboss 的例子、测试脚本和各种脚本配置文g?/span> DTD
lib
攄 jboss 所需要的部分 jar 包文?/span>
client
攄 EJB 客户端运行时所需要的 jar ?/span>
server
攄各启动类型的服务器端 EJB 配置所需要的文g{?/span>
Jboss3.0.4 有三U启动类型,分别?/span> all, default, minimal 。如?/span> windows q_下启?/span> jboss Q可直接启动 bin 目录下的 run.bat 既可。此旉认ؓ?/span> default 形式启动Q如需其它启动方式Q则需要参数设|,如想?/span> all 模式启动Q则q行 run.bat –c all 命o。至于三U启动模式的区别Q无非就是启动的服务多少不同Q具体请参照 JBoss.3.0QuickStart.Draft3.pdf 文档。该文档也有讄 jboss 启动?/span> windows 服务的一D,也可以参照,不过我按照它的做法尝试了一下,发现居然 jboss 的服务会占据 90% 以上?/span> CPU 资源 ?/span>
正如大家所看到的, jboss 启动p么简单,而且也不需要按照自q机器额外q行其他配置。到q一步,大家都很爽吧?/span> OK Q让我们l箋
q本来不应单独成Z章,但是Q网上各资料?/span> JBoss.3.0QuickStart.Draft3.pdf 中都在这一部分对用者进行了误导Q我惛_q里我有必要q行澄清?/span>
启动 jboss 后,我们可以查看 8080 端口Q在览器地址栏中键入 http://localhost:8080 Q我们会发现一个错误页面,内容为?/span> HTTP ERROR: 404 / Not Found RequestURI=/ ”这是正常的Q因ZҎ没有页面可以显C?/span>
在按照网上资料和 JBoss.3.0QuickStart.Draft3.pdf 的要求查?/span> 8082 端口Ӟ我们׃发现Q根本和资料中讲qC一致了?/span> JBoss.3.0QuickStart.Draft3.pdf 中的原文是这LQ?/span> To check if JBoss is running please open a browser and enter http://localhost:8082 which will list all JBoss components running. ”但是,我们会出现一个错误页面!q不是象它所说的会列出所有运行的 JBOSS lg。经q查找,发现其实应该?/span> http://localhost:8080/jmx-console 。此点一定注意,否则会打d学者学?/span> jboss 的兴的。我们通过q个面q行?/span> JBOSS 的各服务的配|和理?/span>
我们再查?/span> http://localhost:8083 会出C个没有错误的I白,正常Q应该是q样?/span>
我们再查?/span> http://localhost:1099 会出C大堆乱字W,当然Q里面包含了你的 IP 地址{等cM的信息?/span> 1099 ?/span> jnp 协议监听名字服务的缺省端口, RMI 的缺省端口也是一L。在 JNDI 中,我们需要用到此端口?/span>
OK Q基本端口信息就q些?/span>