读书人

james 3.0-M2 上的 JMX

发布时间: 2012-08-30 09:55:54 作者: rapoo

james 3.0-M2 下的 JMX
由于项目需要,最近在研读james的源码,james的版本的james-server 3.0-M2。

今天看到james中jmx应用,感觉不错,拿出来分享下

james的这个版本使用了增加了spring,所以看起来条理还是不错的,而且这个版本使用了Maven,把几个不同的模块(比如说dnsservice,SMTP,POP3。。)分成不同的jar打包,所以看起来的比前一个稳定版james-2.3.2好多了。

废话到此了。。。。

james-server 3.0-M2 这个版本的spring的配置文件是在conf/spring-beans.xml
但在Maven下是在container-spring这个模块下main/config/james下。

1。spring加入jmx的属性文件jmx.properties

<bean value="true"/>
<property name="location" value="file://conf/jmx.properties"/>
</bean>


2。配置MbeanExporter类并传入需要的MBean

<bean id="exporter" lazy-init="false">
<property name="beans">
<map>
<entry key="org.apache.james:type=server,name=smtpserver" value-ref="smtpserver"/>
<entry key="org.apache.james:type=server,name=lmtpserver" value-ref="lmtpserver"/>
<entry key="org.apache.james:type=server,name=pop3server" value-ref="pop3server"/>
<entry key="org.apache.james:type=server,name=imapserver" value-ref="imapserver"/>
<entry key="org.apache.james:type=server,name=remotemanager" value-ref="remotemanager"/>
<entry key="org.apache.james:type=component,name=domainlist" value-ref="domainlistmanagement"/>
<entry key="org.apache.james:type=component,name=dnsservice" value-ref="dnsservice"/>
<entry key="org.apache.james:type=component,name=processor" value-ref="processormanagement"/>
<entry key="org.apache.james:type=component,name=virtualusertable" value-ref="virtualusertablemanagement"/>
<entry key="org.apache.james:type=component,name=usermanagement" value-ref="usermanagement"/>
<entry key="org.apache.james:type=component,name=fetchmail" value-ref="fetchmail"/>
<entry key="org.apache.james:type=component,name=mailboxmanagement" value-ref="mailboxmanagermanagement"/>
</map>
</property>

<property name="assembler">
<bean value="org.apache.james.smtpserver.netty.SMTPServerMBean,org.apache.james.remotemanager.netty.RemoteManagerMBean,org.apache.james.pop3server.netty.POP3ServerMBean,org.apache.james.imapserver.netty.IMAPServerMBean,org.apache.james.fetchmail.FetchSchedulerMBean,org.apache.james.domainlist.api.DomainListManagementMBean,org.apache.james.dnsservice.api.DNSServiceMBean,org.apache.james.mailetcontainer.api.ProcessorManagementMBean,org.apache.james.vut.api.VirtualUserTableManagementMBean,org.apache.james.user.api.UserManagementMBean,org.apache.james.adapter.mailbox.MailboxManagerManagementMBean"/>
</bean>
</property>

</bean>
属性 beans 是告诉类 MBeanExporter 必须将哪些bean输出到JMX的 MBeanServer 去。
默认配置中,在 beans 中,Map 中每个条目的key被用做相应条目值所引用的bean的 ObjectName。
<entry key="org.apache.james:type=server,name=smtpserver" value-ref="smtpserver"/>
其中org.apache.james:type=server,name=smtpserver作为ObjectName,org.apache.james是ObjectName的域,type=server,name=smtpserver是ObjectName的键属性。

assembler中InterfaceBasedMBeanInfoAssembler, 它允许你在一系列方法的基础上约束将要输出的方法和属性,这一系列方法是由一组接口来定义的。虽然输出MBeans的标准机制是使用接口和一个简单的命名策略,InterfaceBasedMBeanInfoAssembler 去掉了命名约定的需要而扩展了这一功能,允许你使用一个以上的接口,并且去掉了为了bean去实现MBean接口的需要。


3。james 3.0-M2 这个版本 通过RMI使用Spring发布远程服务
<bean id="registry" value="${jmx.port}" />
<property name="serverSocketFactory" ref="restrictedRmiSocketFactory"/>
<property name="clientSocketFactory" ref="restrictedRmiSocketFactory"/>
</bean>

${jmx.port}从属性文件jmx.properties下读取
restrictedRmiSocketFactory是RMI的服务器端和客服端,james把它写在一个类里了。
其实,最容易配的就是rmi了


4。spring下创建MBeanServer
<bean id="mbeanserver" >
<property name="locateExistingServerIfPossible" value="true"/>
<property name="registerWithFactory" value="true"/>
</bean>

MBean Server是一个能够管理一组MBean的java类,是JMX管理环境的核心,是一个registry(通过查找MBean来注册到MBean Server)。MBean server暴露已经注册了的MBean的management interface,但是从来不暴露对注册了的MBean的引用。另外,如果注册的MBean的类型是不同的,但是MBean Server提供给用户的是一个相同的接口,对于所有类型的MBean进行相同的处理。MBean Server也提供查找MBeans的方法,也可以注册其他的对象作为listener加到MBean上。
Spring会试着查找运行中的 MBeanServer 并用这个server(如果有的话)来注册自己的bean。


5。JMX连接器,Spring JMX使用下面的配置创建、启动和发布一个JMXConnectorServer
<bean id="serverConnector" depends-on="registry">
<property name="objectName" value="connector:name=rmi" />
<property name="serviceUrl" value="service:jmx:rmi://${jmx.address}/jndi/rmi://${jmx.address}:${jmx.port}/jmxrmi" />
</bean>

spring会读取jmx.properties,替换jmx.address和jmx.port的值。

最后,可以使用jconsole工具作为客户端连接到服务器中实时参考信息的发送情况。在JConsole.exe的连接--高级--service地址中填写:serviceUrl的地址即可!



另:我的小站:
NB分享:http://www.nbshare.com

读书人网 >软件架构设计

热点推荐