此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Integration 6.5.1spring-doc.cadn.net.cn

JMX 支持

Spring Integration 提供了用于接收和发布 JMX 通知的通道适配器。spring-doc.cadn.net.cn

项目需要此依赖项:spring-doc.cadn.net.cn

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

入站通道适配器允许轮询 JMX MBean 属性值,出站通道适配器允许调用 JMX MBean作。spring-doc.cadn.net.cn

通知侦听通道适配器

通知侦听通道适配器需要 JMXObjectName用于发布应注册此侦听器的通知的 MBean。 一个非常简单的配置可能类似于以下内容:spring-doc.cadn.net.cn

<int-jmx:notification-listening-channel-adapter id="adapter"
    channel="channel"
    object-name="example.domain:name=publisher"/>
notification-listening-channel-adapter寄存器MBeanServer启动时,默认 bean 名称为mbeanServer,恰好是使用 Spring 的<context:mbean-server/>元素。 如果您需要使用其他名称,请务必包含mbean-server属性。

适配器还可以接受对NotificationFilter以及一个“回拨”对象,用于提供与每个通知一起传回的一些上下文。 这两个属性都是可选的。 扩展前面的示例以包含这些属性以及显式MBeanServerbean name 生成以下示例:spring-doc.cadn.net.cn

<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侦听通道适配器是事件驱动的,并注册了MBeanServer径直。 它不需要任何轮询器配置。spring-doc.cadn.net.cn

仅对于此组件,该组件的object-name属性可以包含对象名称模式,例如org.something:type=MyType,name=*. 在这种情况下,适配器会接收来自对象名称与模式匹配的所有 MBean 的通知。 此外,object-name属性可以包含对<util:list>对象名称模式,如以下示例所示:spring-doc.cadn.net.cn

<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-doc.cadn.net.cn

通知发布通道适配器

通知发布通道适配器相对简单。 它的配置中只需要一个 JMX 对象名称,如以下示例所示:spring-doc.cadn.net.cn

<context:mbean-export/>

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

它还要求MBeanExporter出现在上下文中。 这就是为什么<context:mbean-export/>元素也显示在前面的示例中。spring-doc.cadn.net.cn

将消息发送到此适配器的通道时,将根据消息内容创建通知。 如果有效负载是String,它作为message通知的文本。 任何其他有效负载类型都作为userData通知的。spring-doc.cadn.net.cn

JMX 通知还有一个type,并且它应该是一个以点分隔的String. 有两种方法可以提供type. 始终优先于与JmxHeaders.NOTIFICATION_TYPE钥匙。 或者,您可以提供回退default-notification-type属性,如以下示例所示:spring-doc.cadn.net.cn

<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 中的任何其他轮询适配器一样配置轮询器,也可以依赖默认轮询器。 这object-nameattribute-name是必需的。 还需要 MBeanServer 引用。 但是,默认情况下,它会自动检查名为mbeanServer,与前面描述的通知侦听通道适配器相同。 以下示例演示如何使用 XML 配置属性轮询通道适配器:spring-doc.cadn.net.cn

<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 映射到基元和简单对象,例如Map,List和数组。 这样做允许简单转换为 JSON。 还需要 MBeanServer 引用。 但是,默认情况下,它会自动检查名为mbeanServer,与前面描述的通知侦听通道适配器相同。 以下示例演示如何使用 XML 配置树轮询通道适配器:spring-doc.cadn.net.cn

<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 上的所有属性。 您可以通过提供MBeanObjectConverter配置了适当的过滤器。 您可以使用converter属性,或者您可以使用内部<bean/>定义。 Spring Integration 提供了一个DefaultMBeanObjectConverter这可能需要一个MBeanAttributeFilter在其构造函数参数中。spring-doc.cadn.net.cn

Spring Integration 提供了两个标准过滤器。 这NamedFieldsMBeanAttributeFilter用于指定要包含的属性列表。 这NotNamedFieldsMBeanAttributeFilter用于指定要排除的属性列表。 您还可以实现自己的过滤器。spring-doc.cadn.net.cn

作调用通道适配器

作调用通道适配器支持对 MBean 公开的任何托管作进行消息驱动调用。 每次调用都需要调用作名称和目标 MBean 的对象名称。 这两个都必须由适配器配置显式提供,或者通过JmxHeaders.OBJECT_NAMEJmxHeaders.OPERATION_NAME消息头,分别:spring-doc.cadn.net.cn

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

那么适配器只需要能够发现mbeanServer豆。 如果需要不同的 bean 名称,则提供mbean-server属性。spring-doc.cadn.net.cn

消息的有效负载映射到作的参数(如果有)。 一个Map-typed 有效负载与Stringkeys 被视为名称/值对,而List或数组作为简单的参数列表传递(没有显式参数名称)。 如果作需要单个参数值,则有效负载可以表示该单个值。 此外,如果作不需要任何参数,则将忽略有效负载。spring-doc.cadn.net.cn

如果要公开一个通道,以便由不需要包含标头的消息调用单个常见作,则最后一个选项效果很好。spring-doc.cadn.net.cn

作调用出站网关

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

<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"/>

如果您不提供reply-channel属性,则回复消息将发送到IntegrationMessageHeaderAccessor.REPLY_CHANNEL页眉。 该标头通常由消息流(例如任何网关组件)的入口点自动创建。 但是,如果消息流是通过手动创建 Spring Integration 消息并将其直接发送到通道来启动的,则必须显式指定消息头或使用reply-channel属性。spring-doc.cadn.net.cn

MBean 导出器

Spring Integration 组件本身可能会作为 MBean 公开,当IntegrationMBeanExporter已配置。 要创建IntegrationMBeanExporter,定义一个 bean 并提供对MBeanServer和域名(如果需要)。 您可以省略域,在这种情况下,默认域为org.springframework.integration. 以下示例演示如何声明IntegrationMBeanExporter和关联的MBeanServer实例:spring-doc.cadn.net.cn

<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 核心中提供的导出器正交。 它注册消息通道和消息处理程序,但不注册自身。 您可以使用标准<context:mbean-export/>标记。 导出器附加了一些指标,例如,处理程序数量和排队消息数量的计数。spring-doc.cadn.net.cn

它还有一个有用的作,如有序关闭托管作中所述。spring-doc.cadn.net.cn

Spring Integration 4.0 引入了@EnableIntegrationMBeanExport注释,以便方便地配置默认值integrationMbeanExporter类型IntegrationMBeanExporter@Configuration班级级别。 以下示例显示了如何配置此 Bean:spring-doc.cadn.net.cn

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

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

如果您需要提供更多选项或有多个IntegrationMBeanExporterbean(例如对于不同的MBean服务器或避免与标准SpringMBeanExporter——例如通过@EnableMBeanExport),您可以配置IntegrationMBeanExporter作为通用豆。spring-doc.cadn.net.cn

MBean 对象名称

所有MessageChannel,MessageHandlerMessageSource应用程序中的实例由 MBean 导出器包装,以提供管理和监控功能。 下表列出了为每种组件类型生成的 JMX 对象名称:spring-doc.cadn.net.cn

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

消息频道spring-doc.cadn.net.cn

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

消息源spring-doc.cadn.net.cn

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

消息处理程序spring-doc.cadn.net.cn

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

bean属性采用下表中的值之一:spring-doc.cadn.net.cn

表 2.bean 对象名称部件
豆值 描述

端点spring-doc.cadn.net.cn

封闭端点的 Bean 名称(例如<service-activator>),如果有的话spring-doc.cadn.net.cn

匿名spring-doc.cadn.net.cn

指示封闭端点没有用户指定的 Bean 名称,因此 JMX 名称是输入通道名称。spring-doc.cadn.net.cn

内部spring-doc.cadn.net.cn

对于众所周知的 Spring Integration 默认组件spring-doc.cadn.net.cn

处理程序/源代码spring-doc.cadn.net.cn

以上都不是。 回退到toString()被监视对象的方法(处理程序或源)spring-doc.cadn.net.cn

您可以通过提供对Properties对象object-name-static-properties属性。spring-doc.cadn.net.cn

此外,从 Spring Integration 3.0 开始,您可以使用自定义ObjectNamingStrategy通过将object-naming-strategy属性。 这样做可以更好地控制 MBean 的命名,例如将所有集成 MBean 分组到“集成”类型下。 以下示例显示了一种可能的自定义命名策略实现:spring-doc.cadn.net.cn

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);
	}

}

beanKey参数是一个String包含标准对象名称的default-domain并包括任何其他静态属性。 前面的示例将标准typepart 到componentType并将type设置为“集成”,允许在一个查询中选择所有集成 MBean:'my.domain:type=Integration,*'。 这样做还会将 Bean 分组到 VisualVM 等工具中域下的一个树条目下。spring-doc.cadn.net.cn

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

从 5.1 版开始,任何 bean 名称(由name键)如果包含 Java 标识符(或句点)中不允许的任何字符,则将被引用.).spring-doc.cadn.net.cn

JMX 改进

4.2 版引入了一些重要的改进,代表了对框架中 JMX 支持的相当重大的修改。这些导致 JMX 统计信息收集的性能显着提高,并对其进行更多控制。但是,在一些特定(不常见)的情况下,它对用户代码有一些影响。这些更改将在下面详细说明,必要时要谨慎。spring-doc.cadn.net.cn

@IntegrationManagedResource

类似于@ManagedResource注释,则@IntegrationManagedResource将类标记为有资格导出为 MBean。 但是,仅当应用程序上下文具有IntegrationMBeanExporter.spring-doc.cadn.net.cn

某些 Spring Integration 类(在org.springframework.integration) 包),之前用@ManagedResource现在用两者一起注释@ManagedResource@IntegrationManagedResource. 这是为了向后兼容(请参阅下一项)。 此类 MBean 由任何上下文导出MBeanServer或通过IntegrationMBeanExporter(但不是两者都存在 — 如果两个导出器都存在,则如果 Bean 与managed-components模式)。spring-doc.cadn.net.cn

MBean 导出器 Bean 名称模式

以前,managed-components模式仅具有包容性。 如果 bean 名称与其中一种模式匹配,则将其包含在内。 现在,可以通过在前缀!. 例如!thing*, things匹配所有开头不是thing除了things. 从左到右评估模式。 第一个匹配(正或负)获胜,然后不再应用其他模式。spring-doc.cadn.net.cn

将此语法添加到模式中会导致一个可能(尽管可能不太可能)的问题。 如果你有一个名为"!thing"并且您包含了!thing在 MBean 导出器的managed-components模式,它不再匹配;该模式现在匹配所有未命名的 beanthing. 在这种情况下,您可以转义!在带有 的模式中。 这\\!thingpattern 匹配名为!thing.
集成MBeanExporter 更改

IntegrationMBeanExporter不再实现SmartLifecycle. 这意味着start()stop()作不再可用于注册和注销 MBean。 MBean 现在在上下文初始化期间注册,并在上下文被销毁时取消注册。spring-doc.cadn.net.cn

有序关机管理运行

MBean 导出器允许 JMX作有序地关闭应用程序。 它旨在在停止 JVM 之前使用。 以下示例演示如何使用它:spring-doc.cadn.net.cn

public void stopActiveComponents(long howLong)

它的使用和作在有序关机中进行了描述。spring-doc.cadn.net.cn