spring jmx_JMX和Spring –第2部分

spring jmx

这篇文章从本教程的第1部分继续。

嗨,在我的上一篇文章中,我解释了如何通过Spring设置JMX服务器以及如何通过身份验证和授权保护对它的访问。

在本文中,我将展示如何实现一个简单的MBean,该MBean允许用户在运行时更改Log4j记录器的级别,而无需重新启动应用程序。

为了方便测试,Spring配置与我的前一篇文章仅作了少许更改。 实质保持不变。

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导出器的声明(这也会导致MBean注释被识别,Spring Bean作为MBeans向JMX服务器注册)

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注释(粗体)之外,这是一个普通的Spring bean。 但是,有了这些注释,我们就制成了它的MBean,并且该bean将在启动时向JMX服务器注册。

@ManagedOperation和@ManagedOperationParameters批注确定在jconsole上显示的内容。 可以省略这些注释,但是在不提供任何有关参数类型的信息的情况下,参数名称将不会像p1和p2一样。

例如,使用值foo.bar.baz和INFO调用该函数将导致以下输出:

...snip2011-08-11 21:33:36 LoggerConfigurator [INFO] Set logger foo.bar.baz to level INFO

在本系列的下一篇和最后一篇文章中,我将展示如何设置MBean,以在达到HEAP内存阈值时向侦听器发出警报,如我以前的一篇文章中所述

继续第3部分 。

参考: JMX和Spring –我们的JCG合作伙伴 Marco Tedone的第2部分 ,位于Marco Tedone的博客博客中。


翻译自: https://www.javacodegeeks.com/2012/07/jmx-and-spring-part-2.html

spring jmx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java callable用法_在Java中使用Callable和Future

最近&#xff0c;我们正在开发一个监控仪表板&#xff0c;我们想要ping几个第三方服务器&#xff0c;只是为了检查它们的可用性&#xff0c;或者我们想要调用健康检查。我们正在对服务器进行一系列api调用&#xff0c;这些服务器的IP&#xff0c;用户名和密码被外部化为环境变量…

注意Java 8的[Pri​​mitive] Stream.iterate()中的递归

Tagir Valeev关于Stack Overflow的一个有趣问题最近引起了我的注意。 为了简短起见&#xff08;请阅读问题的详细信息&#xff09;&#xff0c;而以下代码则有效&#xff1a; public static Stream<Long> longs() {return Stream.iterate(1L, i ->1L longs().skip(i…

用java编写生产者消费者问题_用java代码实现生产者和消费者的问题

public class ThreadDemo12 {public static void main(String[] args) {goods gnew goods();Product pronew Product(g);Thread th1new Thread(pro);th1.start();Customer cusnew Customer(g);Thread th2new Thread(cus);th2.start();}}/*** 商品类* author Al菜菜**/class goo…

LeetCode:位运算实现加法

LeetCode&#xff1a;位运算实现加法 写在前面 位运算符 实现加法的思路 两个加数&#xff0c;比如5(101)和6(110)&#xff0c;如何不用加法就能得出两者之和呢&#xff1f; 我们知道二进制计算中&#xff0c;如果使用异或将会产生无进位的两者之和&#xff0c;而两数相与将会产…

[机器学习] 模型评价参数,准确率,召回率,F1-score

很久很久以前&#xff0c;我还是有个建筑梦的大二少年&#xff0c;有一天&#xff0c;讲图的老师看了眼我的设计图&#xff0c;说&#xff1a;“我觉得你这个设计做得很紧张”&#xff0c;当时我就崩溃&#xff0c;对紧张不紧张这样的评价标准理解无能。多年后我终于明白老师当…

Stackoverflow的见解:投票最多的是Spring 4问题

在Stackoverflow上对Spring 4问题进行最投票和回答最多的是什么&#xff1f; 以下是最常见的五个问题和解答。 Spring中的 Component&#xff0c; Controller&#xff0c; Repository和Service批注有什么区别&#xff0c;它们可以互换使用还是具有特定功能&#xff1f; Trans…

java记录登陆时间_Spring security如何实现记录用户登录时间功能

一、原理分析spring security提供了一个接口 AuthenticationSuccessHandler,该接口中只有一个方法&#xff0c;用来进行登录成功后的操作public interface AuthenticationSuccessHandler {/*** Called when a user has been successfully authenticated.** param request the r…

bzoj3680

$模拟退火$ $这种全局最优的问题用模拟退火$ $模拟退火就是每次向四周随机移动&#xff0c;移动的幅度和温度成正比&#xff0c;如果新的位置更优就接受&#xff0c;否则按一定概率接收&#xff0c;概率和温度成正比$ $最后稳定后再在最优解附近蹦跶几下看看有没有更好的$ $你问…

JLBH示例3 –吞吐量对延迟的影响

在这篇文章中&#xff1a; 关于吞吐量对延迟的影响的讨论 如何使用JLBH测量TCP回送 添加探针以测试TCP往返的两半 观察增加吞吐量对延迟的影响 了解必须降低吞吐量才能在高百分位数时获得良好的延迟。 在帖子中&#xff0c;我们看到了考虑协调遗漏的影响或测量延迟一次迭…

java 输入正整数n_java如何输入一个整数 c语言如何输入一个正整数N,再输入N个整数,按从小......

导航:网站首页 > java如何输入一个整数 c语言如何输入一个正整数N,再输入N个整数,按从小... java如何输入一个整数 c语言如何输入一个正整数N,再输入N个整数,按从小... 相关问题: 匿名网友: 可以通过”Scanner“函数 直接输入参数的形式,来实现输入语句,举例: impor…

fastJson去掉指定字段

public static String filterFieldsJson(Object src, Class<?> clazz, String... args) { SimplePropertyPreFilter filter new SimplePropertyPreFilter(clazz, args); return JSON.toJSONString(src, filter); }转载于:https://www.cnblogs.com/Eilen/p/8377953.html

maven依赖最佳实践_Maven最佳实践

maven依赖最佳实践尽管Maven提供了“配置之上的约定”解决方案&#xff0c;但是仍然有足够多的必要配置引起严重的头痛。 在这篇文章中&#xff0c;我将与您分享一些最佳实践&#xff0c;以简化对POM文件的维护。 请勿使用已弃用的引用&#xff0c;例如$ {artifactId}或$ {pom.…

PHP 异常处理

PHP 异常处理 异常用于在指定的错误发生时改变脚本的正常流程。 异常是什么 PHP 5 提供了一种新的面向对象的错误处理方法。 异常处理用于在指定的错误&#xff08;异常&#xff09;情况发生时改变脚本的正常流程。这种情况称为异常。 当异常被触发时&#xff0c;通常会发生&a…

如何使用Elixir和Phoenix快速入门构建CRUD REST API

这篇文章将展示如何使用Elixir和Phoenix框架构建REST API。 重点将是为持久化到Postgres数据库后端的模型提供CRUD&#xff08;创建&#xff0c;读取&#xff0c;更新&#xff0c;删除&#xff09;端点。 我应该警告你&#xff1b; 这是一个简单的例子。 但是&#xff0c;希望它…

01背包(修订版)

由于时间比较充裕&#xff0c;重新修订一部分。 这次把一些补充的放进来&#xff0c;其他的基础说明见后半部分 这些一共说明&#xff1a;01背包、完全背包、多重背包 将会详细说明。 三种背包混合、二维背包、分组背包、依赖背包、泛化背包 将大致说明。 01背包 如上次说明一…

java 马踏棋盘优化_我所知道的十大常用算法之马踏棋盘算法(深度搜索、贪心思想优化 )...

前言需求今天我们学习的是马踏棋盘算法&#xff0c;我们还是从一个场景里引入看看马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的66棋盘Board0&#xff5e;5的某个方格中提示&#xff1a;马按走棋规则(马走日字)进行移动要求&#xff1a;每个方格只进入一次&#xff…

app engine_App Engine中的Google Services身份验证,第2部分

app engine在本教程的第一部分中&#xff0c; 我介绍了如何使用OAuth进行Google API服务的访问/身份验证。 不幸的是&#xff0c;正如我稍后发现的那样&#xff0c;我使用的方法是OAuth 1.0&#xff0c;显然现在Google正式弃用了OAuth 1.0&#xff0c;改用OAuth 2.0版本。 显然…

Django知识总结(一)

壹 ● 有关http协议 一 ● 全称 超文本传输协议(HyperText Transfer Protocol) 二 ● 协议 双方遵循的规范 http协议是属于应用层的协议(还有ftp, smtp等), 即浏览器请求消息和服务器响应消息的一系列规则 三 ● http协议的特性 http是无状态、无连接的协议(stateless, connect…

java数组使用实验报告_JAVA数组与类的定义-java实验报告

JAVA数组与类的定义-java实验报告JAVA数组与类的定义-java实验报告、实验目的与要求1、 熟悉Java类、对象和方法的一般操作练习等。2、 熟悉数组等的定义和使用。二、实验内容及步骤(包括源程序和运行结果截图)1. 编写Java小应用程序&#xff0c;程序中自定义一个方法&#xff…

JPA 2.1和Java EE 7中的JPQL增强功能(第1部分– JOIN ON)

Java EE 7已经存在了几年&#xff0c;它提供了一些非常有用且期待已久的功能&#xff0c;例如实体图以及对存储过程和结果映射的更好支持。 有关概述&#xff0c;请参阅Thorben Janssen的博客文章 。 但是&#xff0c;我想添加有关JPA查询语言功能的更详细的摘要。 在JPQL和Cri…