此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
通知
Spring 的 JMX 产品包括对 JMX 通知的全面支持。
注册通知侦听器
Spring 的 JMX 支持可以轻松注册任意数量的NotificationListeners
具有任意数量的 MBean(这包括由
Spring的MBeanExporter
以及通过其他机制注册的 MBean)。为
例如,考虑希望获得通知(通过Notification
) 每次目标 MBean 的属性发生变化时。以下内容
示例将通知写入控制台:
package com.example;
import javax.management.AttributeChangeNotification;
import javax.management.Notification;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;
public class ConsoleLoggingNotificationListener
implements NotificationListener, NotificationFilter {
public void handleNotification(Notification notification, Object handback) {
System.out.println(notification);
System.out.println(handback);
}
public boolean isNotificationEnabled(Notification notification) {
return AttributeChangeNotification.class.isAssignableFrom(notification.getClass());
}
}
以下示例将ConsoleLoggingNotificationListener
(在前面的
example) 设置为notificationListenerMappings
:
<beans>
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="beans">
<map>
<entry key="bean:name=testBean1" value-ref="testBean"/>
</map>
</property>
<property name="notificationListenerMappings">
<map>
<entry key="bean:name=testBean1">
<bean class="com.example.ConsoleLoggingNotificationListener"/>
</entry>
</map>
</property>
</bean>
<bean id="testBean" class="org.springframework.jmx.JmxTestBean">
<property name="name" value="TEST"/>
<property name="age" value="100"/>
</bean>
</beans>
有了上述配置,每次 JMXNotification
广播来自
目标 MBean (bean:name=testBean1
)、ConsoleLoggingNotificationListener
豆
通过notificationListenerMappings
属性是
通知。这ConsoleLoggingNotificationListener
然后 bean 可以采取任何作
它认为适当地回应了Notification
.
您还可以使用直接的 bean 名称作为导出的 bean 和监听器之间的链接, 如以下示例所示:
<beans>
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="beans">
<map>
<entry key="bean:name=testBean1" value-ref="testBean"/>
</map>
</property>
<property name="notificationListenerMappings">
<map>
<entry key="testBean">
<bean class="com.example.ConsoleLoggingNotificationListener"/>
</entry>
</map>
</property>
</bean>
<bean id="testBean" class="org.springframework.jmx.JmxTestBean">
<property name="name" value="TEST"/>
<property name="age" value="100"/>
</bean>
</beans>
如果您想注册单个NotificationListener
实例
封闭MBeanExporter
exports,您可以使用特殊的通配符 ()
作为*
notificationListenerMappings
财产
map,如以下示例所示:
<property name="notificationListenerMappings">
<map>
<entry key="*">
<bean class="com.example.ConsoleLoggingNotificationListener"/>
</entry>
</map>
</property>
如果您需要执行相反的作(即,注册多个不同的侦听器
MBean),您必须改用notificationListeners
list 属性(在
优先于notificationListenerMappings
属性)。这一次,而不是
配置NotificationListener
对于单个 MBean,我们配置NotificationListenerBean
实例。一个NotificationListenerBean
封装一个NotificationListener
和ObjectName
(或ObjectNames
)它应该成为
在MBeanServer
.这NotificationListenerBean
还封装
许多其他属性,例如NotificationFilter
和任意回手
对象,可用于高级 JMX 通知场景。
使用时的配置NotificationListenerBean
实例并不疯狂
与前面介绍的内容不同,如以下示例所示:
<beans>
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="beans">
<map>
<entry key="bean:name=testBean1" value-ref="testBean"/>
</map>
</property>
<property name="notificationListeners">
<list>
<bean class="org.springframework.jmx.export.NotificationListenerBean">
<constructor-arg>
<bean class="com.example.ConsoleLoggingNotificationListener"/>
</constructor-arg>
<property name="mappedObjectNames">
<list>
<value>bean:name=testBean1</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
<bean id="testBean" class="org.springframework.jmx.JmxTestBean">
<property name="name" value="TEST"/>
<property name="age" value="100"/>
</bean>
</beans>
前面的示例等效于第一个通知示例。那么,假设
我们希望每次Notification
被提出并且
我们还想过滤掉无关的Notifications
通过提供NotificationFilter
.以下示例实现了这些目标:
<beans>
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="beans">
<map>
<entry key="bean:name=testBean1" value-ref="testBean1"/>
<entry key="bean:name=testBean2" value-ref="testBean2"/>
</map>
</property>
<property name="notificationListeners">
<list>
<bean class="org.springframework.jmx.export.NotificationListenerBean">
<constructor-arg ref="customerNotificationListener"/>
<property name="mappedObjectNames">
<list>
<!-- handles notifications from two distinct MBeans -->
<value>bean:name=testBean1</value>
<value>bean:name=testBean2</value>
</list>
</property>
<property name="handback">
<bean class="java.lang.String">
<constructor-arg value="This could be anything..."/>
</bean>
</property>
<property name="notificationFilter" ref="customerNotificationListener"/>
</bean>
</list>
</property>
</bean>
<!-- implements both the NotificationListener and NotificationFilter interfaces -->
<bean id="customerNotificationListener" class="com.example.ConsoleLoggingNotificationListener"/>
<bean id="testBean1" class="org.springframework.jmx.JmxTestBean">
<property name="name" value="TEST"/>
<property name="age" value="100"/>
</bean>
<bean id="testBean2" class="org.springframework.jmx.JmxTestBean">
<property name="name" value="ANOTHER TEST"/>
<property name="age" value="200"/>
</bean>
</beans>
(全面讨论什么是回手对象,以及,
确实,多么好NotificationFilter
是,请参阅 JMX 的部分
标题为“JMX 通知模型”的规范 (1.2)。
发布通知
Spring 不仅支持注册接收Notifications
而且还
用于发布Notifications
.
本节实际上只与具有
通过MBeanExporter .任何现有的用户定义 MBean 都应
使用标准 JMX API 进行通知发布。 |
Spring 的 JMX 通知发布支持中的关键接口是NotificationPublisher
接口(在org.springframework.jmx.export.notification
包)。任何将要成为的豆子
通过MBeanExporter
实例可以实现相关的NotificationPublisherAware
接口以访问NotificationPublisher
实例。这NotificationPublisherAware
接口提供NotificationPublisher
通过简单的 setter 方法到实现 bean,
然后 Bean 可以使用它来发布Notifications
.
如 javadoc 中所述NotificationPublisher
接口,托管 Bean 通过NotificationPublisher
机制不负责通知监听器的状态管理。
Spring 的 JMX 支持负责处理所有 JMX 基础设施问题。
作为应用程序开发人员,您需要做的就是实现NotificationPublisherAware
接口,然后使用
提供NotificationPublisher
实例。请注意,NotificationPublisher
在向MBeanServer
.
使用NotificationPublisher
实例非常简单。您创建了一个 JMXNotification
实例(或适当的Notification
子类),
使用与要发生的事件相关的数据填充通知
published,并调用sendNotification(Notification)
在NotificationPublisher
实例,传入Notification
.
在以下示例中,导出的JmxTestBean
发布一个NotificationEvent
每次add(int, int)
作被调用:
package org.springframework.jmx;
import org.springframework.jmx.export.notification.NotificationPublisherAware;
import org.springframework.jmx.export.notification.NotificationPublisher;
import javax.management.Notification;
public class JmxTestBean implements IJmxTestBean, NotificationPublisherAware {
private String name;
private int age;
private boolean isSuperman;
private NotificationPublisher publisher;
// other getters and setters omitted for clarity
public int add(int x, int y) {
int answer = x + y;
this.publisher.sendNotification(new Notification("add", this, 0));
return answer;
}
public void dontExposeMe() {
throw new RuntimeException();
}
public void setNotificationPublisher(NotificationPublisher notificationPublisher) {
this.publisher = notificationPublisher;
}
}
这NotificationPublisher
界面和让它全部工作的机制是其中之一
Spring 的 JMX 支持的更好功能。然而,它确实带有
将您的类耦合到 Spring 和 JMX。与往常一样,这里的建议是
务实。如果您需要NotificationPublisher
和
您可以接受与 Spring 和 JMX 的耦合,然后这样做。