javascript
spring jmx_JMX和Spring –第2部分
spring jmx
這篇文章從本教程的第1部分繼續(xù)。嗨,在我的上一篇文章中,我解釋了如何通過(guò)Spring設(shè)置JMX服務(wù)器以及如何通過(guò)身份驗(yàn)證和授權(quán)保護(hù)對(duì)它的訪問(wèn)。
在本文中,我將展示如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的MBean,該MBean允許用戶(hù)在運(yùn)行時(shí)更改Log4j記錄器的級(jí)別,而無(wú)需重新啟動(dòng)應(yīng)用程序。
為了方便測(cè)試,Spring配置與我的前一篇文章僅作了少許更改。 實(shí)質(zhì)保持不變。
Spring配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"><bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:jemos-jmx.properties</value><value>file:///${user.home}/.secure/jmxconnector-credentials.properties</value></list></property></bean><!-- In order to automatically detect MBeans we need to recognise Spring beans --><context:component-scan base-package="uk.co.jemos.experiments.jmx.mbeans" /><!-- This causes MBeans annotations to be recognised and MBeans to be registered with the JMX server --><context:mbean-export default-domain="jemos.mbeans"/><bean id="jemosJmxServer" class="org.springframework.jmx.support.ConnectorServerFactoryBean"depends-on="rmiRegistry"><property name="objectName" value="connector:name=rmi" /><property name="serviceUrl"value="service:jmx:rmi://localhost/jndi/rmi://localhost:${jemos.jmx.rmi.port}/jemosJmxConnector" /><property name="environment"><!-- the following is only valid when the sun jmx implementation is used --><map><entry key="jmx.remote.x.password.file" value="${user.home}/.secure/jmxremote.password" /><entry key="jmx.remote.x.access.file" value="${user.home}/.secure/jmxremote.access" /></map></property></bean><bean id="rmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean"><property name="port" value="${jemos.jmx.rmi.port}" /></bean><!-- Used for testing --><bean id="clientConnector" class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean"depends-on="jemosJmxServer"><property name="serviceUrl" value="service:jmx:rmi://localhost/jndi/rmi://localhost:${jemos.jmx.rmi.port}/jemosJmxConnector"/><property name="environment"><map><entry key="jmx.remote.credentials"><bean factory-method="commaDelimitedListToStringArray"><constructor-arg value="${jmx.username},${jmx.password}" /></bean></entry></map></property></bean></beans>我們唯一感興趣的配置部分是掃描Spring組件和MBean導(dǎo)出器的聲明(這也會(huì)導(dǎo)致MBean注釋被識(shí)別,Spring Bean作為MBeans向JMX服務(wù)器注冊(cè))
LoggerConfigurator MBean
package uk.co.jemos.experiments.jmx.mbeans;import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.springframework.jmx.export.annotation.ManagedOperation; import org.springframework.jmx.export.annotation.ManagedOperationParameter; import org.springframework.jmx.export.annotation.ManagedOperationParameters; import org.springframework.jmx.export.annotation.ManagedResource; import org.springframework.stereotype.Component;/*** MBean which allows clients to change or retrieve the logging level for a* Log4j Logger at runtime.* * @author mtedone* */ @Component @ManagedResource(objectName = LoggerConfigurator.MBEAN_NAME, // description = "Allows clients to set the Log4j Logger level at runtime") public class LoggerConfigurator {public static final String MBEAN_NAME = "jemos.mbeans:type=config,name=LoggingConfiguration";@ManagedOperation(description = "Returns the Logger LEVEL for the given logger name")@ManagedOperationParameters({ @ManagedOperationParameter(description = "The Logger Name", name = "loggerName"), })public String getLoggerLevel(String loggerName) {Logger logger = Logger.getLogger(loggerName);Level loggerLevel = logger.getLevel();return loggerLevel == null ? "The logger " + loggerName+ " has not level" : loggerLevel.toString();}@ManagedOperation(description = "Set Logger Level")@ManagedOperationParameters({@ManagedOperationParameter(description = "The Logger Name", name = "loggerName"),@ManagedOperationParameter(description = "The Level to which the Logger must be set", name = "loggerLevel") })public void setLoggerLevel(String loggerName, String loggerLevel) {Logger thisLogger = Logger.getLogger(this.getClass());thisLogger.setLevel(Level.INFO);Logger logger = Logger.getLogger(loggerName);logger.setLevel(Level.toLevel(loggerLevel, Level.INFO));thisLogger.info("Set logger " + loggerName + " to level "+ logger.getLevel());}}除了Spring JMX注釋(粗體)之外,這是一個(gè)普通的Spring bean。 但是,有了這些注釋,我們就制成了它的MBean,并且該bean將在啟動(dòng)時(shí)向JMX服務(wù)器注冊(cè)。
@ManagedOperation和@ManagedOperationParameters批注確定在jconsole上顯示的內(nèi)容。 可以省略這些注釋,但是在不提供任何有關(guān)參數(shù)類(lèi)型的信息的情況下,參數(shù)名稱(chēng)將不會(huì)像p1和p2一樣。
例如,使用值foo.bar.baz和INFO調(diào)用該函數(shù)將導(dǎo)致以下輸出:
...snip2011-08-11 21:33:36 LoggerConfigurator [INFO] Set logger foo.bar.baz to level INFO在本系列的下一篇和最后一篇文章中,我將展示如何設(shè)置MBean,以在達(dá)到HEAP內(nèi)存閾值時(shí)向偵聽(tīng)器發(fā)出警報(bào),如我以前的一篇文章中所述
繼續(xù)第3部分 。
參考: JMX和Spring –我們的JCG合作伙伴 Marco Tedone的第2部分 ,位于Marco Tedone的博客博客中。
翻譯自: https://www.javacodegeeks.com/2012/07/jmx-and-spring-part-2.html
spring jmx
總結(jié)
以上是生活随笔為你收集整理的spring jmx_JMX和Spring –第2部分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (血腥ddos软件下载)
- 下一篇: Stackoverflow的见解:投票最