james 3.0-M2 下的 JMX

tengmuxin 2011-01-11

由于项目需要,最近在研读james的源码,james的版本的james-server3.0-M2。

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

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

废话到此了。。。。

james-server3.0-M2这个版本的spring的配置文件是在conf/spring-beans.xml

但在Maven下是在container-spring这个模块下main/config/james下。

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

<beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<propertyname="ignoreUnresolvablePlaceholders"value="true"/>

<propertyname="location"value="file://conf/jmx.properties"/>

</bean>

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

<beanid="exporter"class="org.springframework.jmx.export.MBeanExporter"lazy-init="false">

<propertyname="beans">

<map>

<entrykey="org.apache.james:type=server,name=smtpserver"value-ref="smtpserver"/>

<entrykey="org.apache.james:type=server,name=lmtpserver"value-ref="lmtpserver"/>

<entrykey="org.apache.james:type=server,name=pop3server"value-ref="pop3server"/>

<entrykey="org.apache.james:type=server,name=imapserver"value-ref="imapserver"/>

<entrykey="org.apache.james:type=server,name=remotemanager"value-ref="remotemanager"/>

<entrykey="org.apache.james:type=component,name=domainlist"value-ref="domainlistmanagement"/>

<entrykey="org.apache.james:type=component,name=dnsservice"value-ref="dnsservice"/>

<entrykey="org.apache.james:type=component,name=processor"value-ref="processormanagement"/>

<entrykey="org.apache.james:type=component,name=virtualusertable"value-ref="virtualusertablemanagement"/>

<entrykey="org.apache.james:type=component,name=usermanagement"value-ref="usermanagement"/>

<entrykey="org.apache.james:type=component,name=fetchmail"value-ref="fetchmail"/>

<entrykey="org.apache.james:type=component,name=mailboxmanagement"value-ref="mailboxmanagermanagement"/>

</map>

</property>

<propertyname="assembler">

<beanclass="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">

<propertyname="managedInterfaces"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。

<entrykey="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。james3.0-M2这个版本通过RMI使用Spring发布远程服务

<beanid="registry"class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">

<propertyname="port"value="${jmx.port}"/>

<propertyname="serverSocketFactory"ref="restrictedRmiSocketFactory"/>

<propertyname="clientSocketFactory"ref="restrictedRmiSocketFactory"/>

</bean>

${jmx.port}从属性文件jmx.properties下读取

restrictedRmiSocketFactory是RMI的服务器端和客服端,james把它写在一个类里了。

其实,最容易配的就是rmi了

4。spring下创建MBeanServer

<beanid="mbeanserver"class="org.springframework.jmx.support.MBeanServerFactoryBean">

<propertyname="locateExistingServerIfPossible"value="true"/>

<propertyname="registerWithFactory"value="true"/>

</bean>

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

Spring会试着查找运行中的MBeanServer并用这个server(如果有的话)来注册自己的bean。

5。JMX连接器,SpringJMX使用下面的配置创建、启动和发布一个JMXConnectorServer

<beanid="serverConnector"class="org.springframework.jmx.support.ConnectorServerFactoryBean"depends-on="registry">

<propertyname="objectName"value="connector:name=rmi"/>

<propertyname="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

相关推荐