该版本仍在开发中,尚未被视为稳定。对于最新的稳定版本,请使用 Spring Integration 7.0.0spring-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>6.3.12-SNAPSHOT</version>
</dependency>
compile "org.springframework.integration:spring-integration-jmx:6.3.12-SNAPSHOT"

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

通知监听频道适配器

通知监听通道适配器需要 JMX 接口对象名称对于发布该监听者应注册通知的MBean。 一个非常简单的配置可能如下:spring-doc.cadn.net.cn

<int-jmx:notification-listening-channel-adapter id="adapter"
    channel="channel"
    object-name="example.domain:name=publisher"/>
通知-监听-通道适配器寄存器MBeanServer启动时,默认的豆子名称是mbeanServer,恰好是使用 Spring 生成的豆名<context:mbean-server/>元素。 如果需要使用其他名字,请务必包含mbean-server属性。

适配器还可以接受对通知过滤器以及一个“回传”对象,用于提供每次通知中传递的上下文。 这两个属性都是可选的。 将上述示例扩展为包含这些属性以及显式的MBeanServer豆名产生了以下示例: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

仅对于该组件,对象名称属性可以包含对象名称模式(例如,“org.something:type=MyType,name=*”)。在这种情况下,适配器会收到所有对象名称与模式相符的MBean的通知。此外,对象名称属性可以包含对<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>

当启用调试级别日志时,所在的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"/>

它还要求MBean出口商要在语境中存在。这就是为什么<context:mbean-export/>元素也在前面的例子中显示。spring-doc.cadn.net.cn

当消息发送到该适配器的信道时,通知是根据消息内容生成的。如果有效载荷是字符串,它传递为消息通知文本。任何其他有效载荷类型都作为用户数据通知。spring-doc.cadn.net.cn

JMX 通知还有一个类型,并且应该是一个点分隔的字符串. 有两种方式可以提供类型. 优先级总是赋予与JmxHeaders.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中任何其他轮询适配器一样配置轮询器(或者依赖默认轮询器)。 这对象名称以及属性-名称是必需的。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 映射到原语和简单对象,例如地图,列表, 以及数组。这样做可以简单地转换为(例如)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>

前面的例子包含了所选MBeans上的所有属性。你可以通过提供MBeanObjectConverter该转换器配置了相应的Filter。你可以通过使用转炉属性,或者你也可以用内层<豆/>定义。 Spring 集成提供了默认MBean对象转换器可以MBean属性Filter在构造子参数中。spring-doc.cadn.net.cn

Spring Integration 提供两种标准Filter。 这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豆。 如果需要不同的豆名,请提供mbean-server属性并附有引用。spring-doc.cadn.net.cn

消息的有效载荷映射到作参数(如有)。 一个地图- 类型有效载荷字符串键被视为名称/值对,而列表或数组作为简单的参数列表传递(无显式参数名)。 如果作需要单一参数值,载荷可以表示该单一值。 此外,如果作不需要参数,有效载荷将被忽略。spring-doc.cadn.net.cn

如果你想为一个普通作暴露通道,让不需要包含报头的消息调用,最后一个选项效果很好。spring-doc.cadn.net.cn

作调用出站网关

类似于作调用通道适配器,Spring Integration也提供作调用出站网关,当需要返回值时,你可以在处理非无效作时使用它。 返回值作为消息有效载荷发送给回复信道由网关指定。 以下示例展示了如何使用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"/>

如果您不提供回复信道属性,回复消息发送到由IntegrationMessageHeaderAccessor.REPLY_CHANNEL页眉。 该头通常由消息流的入口点自动创建,例如任何网关组件。 然而,如果消息流是通过手动创建 Spring 集成消息并直接发送到通道开始的,你必须明确指定消息头部或使用回复信道属性。spring-doc.cadn.net.cn

MBean 出口商

IntegrationMBeanExporter已配置。 要创建IntegrationMBeanExporter,定义一个豆子,并提供对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 core提供的导出器是正交的。 它会注册消息通道和消息处理程序,但不注册自身。 你可以通过使用标准暴露导出器本身(以及 Spring 集成中的某些其他组件)<context:mbean-export/>标记。 导出器附带一些指标——例如,处理程序数量和队列消息数量的计数。spring-doc.cadn.net.cn

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

Spring Integration 4.0 引入了@EnableIntegrationMBeanExport注释以便方便配置默认值integrationMbeanExporter类型豆IntegrationMBeanExporter@Configuration班级层级。 以下示例展示了如何配置这个豆子:spring-doc.cadn.net.cn

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

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

如果你需要提供更多选项,或者有多个选项IntegrationMBeanExporter豆子(例如用于不同的MBean服务器,或避免与标准Spring的冲突MBean出口商——例如@EnableMBeanExport),你可以配置一个IntegrationMBeanExporter作为普通豆子。spring-doc.cadn.net.cn

MBean 对象名称

所有的消息频道,消息处理器消息源应用中的实例由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>`

源和处理器对象名称中的属性取下表中的某个值:spring-doc.cadn.net.cn

表2。bean 对象名称部分
豆子价值 描述

端点spring-doc.cadn.net.cn

围括端点的豆名(例如)<服务激活器>),如果存在的话spring-doc.cadn.net.cn

匿名spring-doc.cadn.net.cn

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

内部spring-doc.cadn.net.cn

对于知名的 Spring 集成默认组件spring-doc.cadn.net.cn

处理员/来源spring-doc.cadn.net.cn

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

你可以通过提供对性能对象在对象名静态属性属性。spring-doc.cadn.net.cn

另外,自从 Spring Integration 3.0 起,你可以用自定义软件对象命名策略通过设置对象命名策略属性。 这样做可以更好地控制MBean的命名,比如将所有集成MBean归入“Integration”类型。 以下示例展示了一种可能的自定义命名策略实现: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);
	}

}

豆键论元是字符串包含标准对象名称,开头为默认域名并包括任何额外的静态性质。 前例推动了标准类型部分为componentType并将类型设置为“Integration”,使得在一次查询中选择所有集成MBean:'my.domain:type=Integration,*'。 这样做还会将豆子归入域下的同一棵树,在 VisualVM 等工具中。spring-doc.cadn.net.cn

默认命名策略是元数据命名策略. 出口商传播默认域名让该对象在解析 bean 键失败时生成一个备用对象名。 如果你的自定义命名策略是元数据命名策略(或其子类),出口者不会传播默认域名. 你必须在你的战略豆上配置它。

从5.1版本开始,任何Beans名称(用名称如果 key 在对象名中包含任何不允许出现在 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 集成类(在org.springframework.integration)package)之前被注释为@ManagedResource现在都被注释为@ManagedResource@IntegrationManagedResource. 这是为了向下兼容(见下一条)。 此类MBean可被导出至任何上下文MBeanServer或由IntegrationMBeanExporter(但不会两者同时出现——如果两个出口者都存在,则积分出口器会对豆子进行输出,且豆子与托管组件模式)。spring-doc.cadn.net.cn

MBean 出口豆名称模式

此前,托管组件模式仅限于包容性。 如果豆子名字与其中一个图案相符,就会被包含进去。 现在,可以通过在前缀 以 来否定该模式!. 例如!东西*,东西匹配所有非以 开头的Beans名称东西除了事情. 模式从左到右进行评估。 第一个匹配(正负)获胜,之后不再应用其他模式。spring-doc.cadn.net.cn

将这种语法加入模式会带来一个可能(虽然不太可能)的问题。 如果你有一颗叫做“!东西”你包含了一个模式!东西在你的MBean导出商中托管组件模式不再匹配;现在图案与所有未命名的豆子相匹配东西. 在这种情况下,你可以跳出!在与 的模式中。 这\\!东西图案匹配一个名为!东西.
集成MBean导出器变更

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

有序停机管理运营

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

public void stopActiveComponents(long howLong)

其使用和作详见《有序关机》一书。spring-doc.cadn.net.cn