此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

Spring Integration 提供了用于接收和发布 JMX 通知的通道适配器。Spring中文文档

您需要将此依赖项包含在项目中:Spring中文文档

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-jmx</artifactId>
    <version>6.3.2-SNAPSHOT</version>
</dependency>
compile "org.springframework.integration:spring-integration-jmx:6.3.2-SNAPSHOT"

入站通道适配器允许轮询 JMX MBean 属性值,而出站通道适配器允许调用 JMX MBean 操作。Spring中文文档

通知监听信道适配器

通知侦听通道适配器需要 MBean 的 JMX,用于发布应注册此侦听器的通知。 一个非常简单的配置可能类似于以下内容:ObjectNameSpring中文文档

<int-jmx:notification-listening-channel-adapter id="adapter"
    channel="channel"
    object-name="example.domain:name=publisher"/>
在启动时注册 an,默认的 bean 名称是 ,这恰好与使用 Spring 的元素时生成的 bean 名称相同。 如果需要使用其他名称,请务必包含该属性。notification-listening-channel-adapterMBeanServermbeanServer<context:mbean-server/>mbean-server

适配器还可以接受对 a 和 “handback” 对象的引用,以提供随每个通知传回的上下文。 这两个属性都是可选的。 扩展前面的示例以包含这些属性以及显式 Bean 名称将生成以下示例:NotificationFilterMBeanServerSpring中文文档

<int-jmx:notification-listening-channel-adapter id="adapter"
    channel="channel"
    mbean-server="someServer"
    object-name="example.domain:name=somePublisher"
    notification-filter="notificationFilter"
    handback="myHandback"/>

_Notification监听通道适配器是事件驱动的,并直接注册到。 它不需要任何轮询器配置。MBeanServerSpring中文文档

仅对于此组件,该属性可以包含对象名称模式(例如, “org.something:type=MyType,name=*”)。 在这种情况下,适配器将接收来自对象名称与模式匹配的所有 MBean 的通知。 此外,该属性可以包含对对象名称模式的 SpEL 引用,如以下示例所示:object-nameobject-name<util:list>Spring中文文档

<jmx:notification-listening-channel-adapter id="manyNotificationsAdapter"
    channel="manyNotificationsChannel"
    object-name="#{patterns}"/>

<util:list id="patterns">
    <value>org.foo:type=Foo,name=*</value>
    <value>org.foo:type=Bar,name=*</value>
</util:list>

启用 DEBUG 级别日志记录时,将记录所定位的 MBean 的名称。Spring中文文档

在启动时注册 an,默认的 bean 名称是 ,这恰好与使用 Spring 的元素时生成的 bean 名称相同。 如果需要使用其他名称,请务必包含该属性。notification-listening-channel-adapterMBeanServermbeanServer<context:mbean-server/>mbean-server

仅对于此组件,该属性可以包含对象名称模式(例如, “org.something:type=MyType,name=*”)。 在这种情况下,适配器将接收来自对象名称与模式匹配的所有 MBean 的通知。 此外,该属性可以包含对对象名称模式的 SpEL 引用,如以下示例所示:object-nameobject-name<util:list>Spring中文文档

<jmx:notification-listening-channel-adapter id="manyNotificationsAdapter"
    channel="manyNotificationsChannel"
    object-name="#{patterns}"/>

<util:list id="patterns">
    <value>org.foo:type=Foo,name=*</value>
    <value>org.foo:type=Bar,name=*</value>
</util:list>

启用 DEBUG 级别日志记录时,将记录所定位的 MBean 的名称。Spring中文文档

通知发布通道适配器

通知发布通道适配器相对简单。 它的配置中只需要一个 JMX 对象名称,如以下示例所示:Spring中文文档

<context:mbean-export/>

<int-jmx:notification-publishing-channel-adapter id="adapter"
    channel="channel"
    object-name="example.domain:name=publisher"/>

它还要求上下文中存在一个。 这就是为什么该元素也显示在前面的示例中的原因。MBeanExporter<context:mbean-export/>Spring中文文档

将消息发送到此适配器的通道时,将根据消息内容创建通知。 如果有效负载是 ,则将其作为通知的文本传递。 任何其他有效负载类型都将作为通知传递。StringmessageuserDataSpring中文文档

JMX 通知也有一个 ,它应该是一个点分隔的 。 有两种方法可以提供 . 始终优先于与键关联的消息标头值。 或者,您可以在配置中提供回退属性,如以下示例所示:typeStringtypeJmxHeaders.NOTIFICATION_TYPEdefault-notification-typeSpring中文文档

<context:mbean-export/>

<int-jmx:notification-publishing-channel-adapter id="adapter"
    channel="channel"
    object-name="example.domain:name=publisher"
    default-notification-type="some.default.type"/>

属性轮询通道适配器

当您需要定期检查通过 MBean 作为托管属性提供的某些值时,属性轮询通道适配器非常有用。 您可以按照与Spring Integration中的任何其他轮询适配器相同的方式配置轮询器(或者您可以依赖默认轮询器)。 和 是必需的。 还需要 MBeanServer 引用。 但是,默认情况下,它会自动检查名为 的 bean,与前面描述的通知侦听通道适配器相同。 下面的示例演示如何使用 XML 配置属性轮询通道适配器:object-nameattribute-namembeanServerSpring中文文档

<int-jmx:attribute-polling-channel-adapter id="adapter"
    channel="channel"
    object-name="example.domain:name=someService"
    attribute-name="InvocationCount">
        <int:poller max-messages-per-poll="1" fixed-rate="5000"/>
</int-jmx:attribute-polling-channel-adapter>

树轮询通道适配器

树轮询通道适配器查询 JMX MBean 树,并发送一条消息,其中包含一个有效负载,该负载是与查询匹配的对象图。 默认情况下,MBean 映射到基元和简单对象,例如 、 和数组。 这样做可以简单地转换为(例如)JSON。 还需要 MBeanServer 引用。 但是,默认情况下,它会自动检查名为 的 bean,与前面描述的通知侦听通道适配器相同。 下面的示例演示如何使用 XML 配置树轮询通道适配器:MapListmbeanServerSpring中文文档

<int-jmx:tree-polling-channel-adapter id="adapter"
    channel="channel"
    query-name="example.domain:type=*">
        <int:poller max-messages-per-poll="1" fixed-rate="5000"/>
</int-jmx:tree-polling-channel-adapter>

前面的示例包括所选 MBean 上的所有属性。 您可以通过提供配置了适当过滤器的属性来过滤属性。 您可以使用该属性提供转换器作为对 Bean 定义的引用,也可以使用内部定义。 Spring Integration 提供了一个可以在其构造函数参数中采用 a 的 it。MBeanObjectConverterconverter<bean/>DefaultMBeanObjectConverterMBeanAttributeFilterSpring中文文档

Spring Integration 提供了两个标准筛选器。 允许您指定要包含的属性列表。 允许您指定要排除的属性列表。 您还可以实现自己的过滤器。NamedFieldsMBeanAttributeFilterNotNamedFieldsMBeanAttributeFilterSpring中文文档

操作调用通道适配器

操作调用通道适配器支持对 MBean 公开的任何托管操作进行消息驱动调用。 每次调用都需要调用操作名称和目标 MBean 的对象名称。 这两者都必须分别由适配器配置或 via 和 message 标头显式提供:JmxHeaders.OBJECT_NAMEJmxHeaders.OPERATION_NAMESpring中文文档

<int-jmx:operation-invoking-channel-adapter id="adapter"
    object-name="example.domain:name=TestBean"
    operation-name="ping"/>

然后适配器只需要能够发现 bean。 如果需要不同的 Bean 名称,则为属性提供引用。mbeanServermbean-serverSpring中文文档

消息的有效负载将映射到操作的参数(如果有)。 带有键的 -type 有效负载被视为名称/值对,而 or 数组作为简单参数列表传递(没有显式参数名称)。 如果操作需要单个参数值,则有效负载可以表示该单个值。 此外,如果操作不需要参数,则有效负载将被忽略。MapStringListSpring中文文档

如果要公开一个通道,以便由不需要包含标头的消息调用单个常见操作,则最后一个选项效果很好。Spring中文文档

操作调用出站网关

与操作调用通道适配器类似,Spring Integration 也提供了一个操作调用出站网关,当需要返回值时,您可以在处理非 void 操作时使用它。 返回值将作为消息有效负载发送到网关指定的负载。 以下示例演示如何使用 XML 配置操作调用出站网关:reply-channelSpring中文文档

<int-jmx:operation-invoking-outbound-gateway request-channel="requestChannel"
   reply-channel="replyChannel"
   object-name="o.s.i.jmx.config:type=TestBean,name=testBeanGateway"
   operation-name="testWithReturn"/>

如果未提供该属性,则回复消息将发送到标头标识的通道。 该头通常由消息流的入口点(如任何网关组件)自动创建。 但是,如果消息流是通过手动创建 Spring Integration 消息并将其直接发送到通道来启动的,那么必须显式指定消息头或使用该属性。reply-channelIntegrationMessageHeaderAccessor.REPLY_CHANNELreply-channelSpring中文文档

MBean 出口商

配置时,Spring Integration 组件本身可能会公开为 MBean。 要创建 的实例,请定义一个 bean 并提供对 和 域名的引用(如果需要)。 您可以省略域,在这种情况下,默认域为 。 下面的示例演示如何声明一个实例和一个关联的实例:IntegrationMBeanExporterIntegrationMBeanExporterMBeanServerorg.springframework.integrationIntegrationMBeanExporterMBeanServerSpring中文文档

<int-jmx:mbean-export id="integrationMBeanExporter"
            default-domain="my.company.domain" server="mbeanServer"/>

<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
    <property name="locateExistingServerIfPossible" value="true"/>
</bean>

MBean 导出器与 Spring Core 中提供的导出器正交。 它注册消息通道和消息处理程序,但不注册自身。 您可以使用标准标记公开导出器本身(以及 Spring Integration 中的某些其他组件)。 导出器附加了一些指标,例如,处理程序的数量和排队的消息数量。<context:mbean-export/>Spring中文文档

它还具有有用的操作,如有序关闭托管操作中所述。Spring中文文档

Spring Integration 4.0 引入了注解,以便方便地配置默认类型的 bean,并在类级别使用几个有用的选项。 以下示例显示如何配置此 Bean:@EnableIntegrationMBeanExportintegrationMbeanExporterIntegrationMBeanExporter@ConfigurationSpring中文文档

@Configuration
@EnableIntegration
@EnableIntegrationMBeanExport(server = "mbeanServer", managedComponents = "input")
public class ContextConfiguration {

	@Bean
	public MBeanServerFactoryBean mbeanServer() {
		return new MBeanServerFactoryBean();
	}
}

如果您需要提供更多选项或具有多个 bean(例如,用于不同的 MBean 服务器,或者为了避免与标准 Spring 冲突,例如通过),您可以将 bean 配置为通用 bean。IntegrationMBeanExporterMBeanExporter@EnableMBeanExportIntegrationMBeanExporterSpring中文文档

MBean 对象名称

应用程序中的所有 、 和 实例都由 MBean 导出器包装,以提供管理和监控功能。 下表列出了为每种组件类型生成的 JMX 对象名称:MessageChannelMessageHandlerMessageSourceSpring中文文档

表 1.MBean 对象名称
组件类型 对象名称

消息频道Spring中文文档

 `o.s.i:type=MessageChannel,name=<channelName>`

消息源Spring中文文档

 `o.s.i:type=MessageSource,name=<channelName>,bean=<source>`

MessageHandlerSpring中文文档

 `o.s.i:type=MessageSource,name=<channelName>,bean=<source>`

源和处理程序的对象名称中的属性采用下表中的值之一:beanSpring中文文档

表 2.bean ObjectName 部件
Bean 值 描述

端点Spring中文文档

封闭端点的 Bean 名称(例如),如果有<service-activator>Spring中文文档

匿名Spring中文文档

指示封闭的端点没有用户指定的 Bean 名称,因此 JMX 名称是输入通道名称。Spring中文文档

内部Spring中文文档

对于众所周知的 Spring Integration 默认组件Spring中文文档

处理程序/源Spring中文文档

以上都不是。 回退到被监视对象的方法(处理程序或源)toString()Spring中文文档

您可以通过在属性中提供对对象的引用来将自定义元素追加到对象名称。Propertiesobject-name-static-propertiesSpring中文文档

此外,从 Spring Integration 3.0 开始,您可以通过设置属性来使用自定义 ObjectNamingStrategy。 这样做可以更好地控制 MBean 的命名,例如将所有集成 MBean 分组到“集成”类型下。 以下示例演示了一种可能的自定义命名策略实现:object-naming-strategySpring中文文档

public class Namer implements ObjectNamingStrategy {

	private final ObjectNamingStrategy realNamer = new KeyNamingStrategy();
	@Override
	public ObjectName getObjectName(Object managedBean, String beanKey) throws MalformedObjectNameException {
		String actualBeanKey = beanKey.replace("type=", "type=Integration,componentType=");
		return realNamer.getObjectName(managedBean, actualBeanKey);
	}

}

参数是包含标准对象名称的 a,以 开头,并包含任何其他静态属性。 前面的示例将标准部件移动到并设置为“Integration”,从而允许在一个查询中选择所有集成 MBean:'my.domain:type=Integration,*'。 这样做还会将 Bean 分组到诸如 VisualVM 等工具的域下的一个树条目下。beanKeyStringdefault-domaintypecomponentTypetypeSpring中文文档

默认命名策略是 MetadataNamingStrategy。 导出器将 传播到该对象,以便在解析 Bean 键失败时生成回退对象名称。 如果自定义命名策略是 (或其子类) ,则导出器不会传播 . 您必须在策略 Bean 上配置它。default-domainMetadataNamingStrategydefault-domain

从 V5.1 开始,如果任何 Bean 名称(由对象名称中的键表示)包含 Java 标识符(或句点)中不允许的任何字符,则它们将被引用。name.Spring中文文档

JMX 改进

版本 4.2 引入了一些重要的改进,代表了对框架中 JMX 支持的相当大的修改。 这些结果显著提高了 JMX 统计信息集合的性能,并对其进行了更多的控制。 但是,在一些特定(不常见)情况下,它对用户代码有一些影响。 下面详细介绍了这些更改,必要时请谨慎使用。Spring中文文档

@IntegrationManagedResource

与注释类似,将类标记为有资格导出为 MBean。 但是,仅当应用程序上下文具有 .@ManagedResource@IntegrationManagedResourceIntegrationMBeanExporterSpring中文文档

某些 Spring Integration 类(在 ) 包中)以前用 和 进行注释,现在用 和 进行注释。 这是为了向后兼容(请参阅下一项)。 这样的 MBean 由任何上下文或 an 导出(但不能同时导出 — 如果两个导出器都存在,则如果 Bean 与模式匹配,则 Bean 由集成导出器导出)。org.springframework.integration@ManagedResource@ManagedResource@IntegrationManagedResourceMBeanServerIntegrationMBeanExportermanaged-componentsSpring中文文档

MBean 导出器 Bean 名称模式

以前,这些模式仅包含。 如果 Bean 名称与其中一个模式匹配,则该名称将被包括在内。 现在,可以通过在 前缀 来否定该模式。 例如,匹配所有不以 except 开头的 Bean 名称。 模式从左到右计算。 第一场比赛(正数或负数)获胜,然后不再应用进一步的模式。managed-components!!thing*, thingsthingthingsSpring中文文档

将此语法添加到模式中会导致一个可能的(尽管可能不太可能)问题。 如果您有一个命名的 bean,并且您在 MBean 导出器的模式中包含了一个模式,则它不再匹配;该模式现在匹配所有未命名的 Bean 。 在这种情况下,您可以使用 . 该模式与名为 的 Bean 匹配。"!thing"!thingmanaged-componentsthing!\\!thing!thing
IntegrationMBeanExporter 更改

不再实现 . 这意味着 和 操作不再可用于注册和注销 MBean。 现在,MBean 在上下文初始化期间注册,并在上下文被销毁时取消注册。IntegrationMBeanExporterSmartLifecyclestart()stop()Spring中文文档

有序关机管理操作

MBean 导出器允许 JMX 操作有序地关闭应用程序。 它旨在在停止 JVM 之前使用。 以下示例演示如何使用它:Spring中文文档

public void stopActiveComponents(long howLong)

它的使用和操作在有序关闭中进行了描述。Spring中文文档

MBean 导出器与 Spring Core 中提供的导出器正交。 它注册消息通道和消息处理程序,但不注册自身。 您可以使用标准标记公开导出器本身(以及 Spring Integration 中的某些其他组件)。 导出器附加了一些指标,例如,处理程序的数量和排队的消息数量。<context:mbean-export/>Spring中文文档

它还具有有用的操作,如有序关闭托管操作中所述。Spring中文文档

表 1.MBean 对象名称
组件类型 对象名称

消息频道Spring中文文档

 `o.s.i:type=MessageChannel,name=<channelName>`

消息源Spring中文文档

 `o.s.i:type=MessageSource,name=<channelName>,bean=<source>`

MessageHandlerSpring中文文档

 `o.s.i:type=MessageSource,name=<channelName>,bean=<source>`
表 2.bean ObjectName 部件
Bean 值 描述

端点Spring中文文档

封闭端点的 Bean 名称(例如),如果有<service-activator>Spring中文文档

匿名Spring中文文档

指示封闭的端点没有用户指定的 Bean 名称,因此 JMX 名称是输入通道名称。Spring中文文档

内部Spring中文文档

对于众所周知的 Spring Integration 默认组件Spring中文文档

处理程序/源Spring中文文档

以上都不是。 回退到被监视对象的方法(处理程序或源)toString()Spring中文文档

默认命名策略是 MetadataNamingStrategy。 导出器将 传播到该对象,以便在解析 Bean 键失败时生成回退对象名称。 如果自定义命名策略是 (或其子类) ,则导出器不会传播 . 您必须在策略 Bean 上配置它。default-domainMetadataNamingStrategydefault-domain
将此语法添加到模式中会导致一个可能的(尽管可能不太可能)问题。 如果您有一个命名的 bean,并且您在 MBean 导出器的模式中包含了一个模式,则它不再匹配;该模式现在匹配所有未命名的 Bean 。 在这种情况下,您可以使用 . 该模式与名为 的 Bean 匹配。"!thing"!thingmanaged-componentsthing!\\!thing!thing