james 3.0-M2 下的 JMX
由于项目需要,最近在研读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