Spring Integration JMX 支持
Spring 集成提供了用于接收和发布 JMX 通知的通道适配器。
您需要将此依赖项包含在项目中:
入站通道适配器允许轮询 JMX MBean 属性值,出站通道适配器允许调用 JMX MBean 操作。
通知侦听通道适配器
通知侦听通道适配器需要 MBean 的 JMX,该 MBean 发布应注册此侦听器的通知。 非常简单的配置可能类似于以下内容:ObjectName
在启动时寄存器,默认的 bean 名称是 ,它恰好与使用 Spring 元素时生成的 bean 名称相同。 如果需要使用其他名称,请确保包含该属性。 |
适配器还可以接受对 a 和“handback”对象的引用,以提供随每个通知一起传回的一些上下文。 这两个属性都是可选的。 扩展前面的示例以包括这些属性以及显式 Bean 名称将生成以下示例:NotificationFilter
MBeanServer
_Notification侦听通道适配器是事件驱动的,并直接向 注册。 它不需要任何轮询器配置。MBeanServer
仅对于此组件,该属性可以包含对象名称模式(例如, “org.something:type=MyType,name=*”)。 在这种情况下,适配器接收来自对象名称与模式匹配的所有 MBean 的通知。 此外,该属性可以包含对对象名称模式的 SpEL 引用,如以下示例所示:
启用调试级别日志记录时,将记录找到的 MBean 的名称。
|
通知发布通道适配器
通知发布通道适配器相对简单。 它的配置中只需要一个 JMX 对象名称,如以下示例所示:
它还要求在上下文中存在。 这就是为什么前面的示例中也显示了该元素的原因。MBeanExporter
将消息发送到此适配器的通道时,将从消息内容创建通知。 如果有效负载为 ,则将其作为通知的文本传递。 任何其他有效负载类型都作为通知的 传递。String
message
userData
JMX 通知也有一个 ,它应该是一个点分隔的 。 有两种方法可以提供 . 始终为与键关联的邮件头值提供优先级。 或者,您可以在配置中提供回退属性,如以下示例所示:type
String
type
JmxHeaders.NOTIFICATION_TYPE
default-notification-type
属性轮询通道适配器
当您需要定期检查可通过 MBean 作为托管属性提供的某些值时,属性轮询通道适配器非常有用。 您可以像在 Spring 集成中以与任何其他轮询适配器相同的方式配置轮询器(或者您可以依赖默认轮询器)。 和 是必需的。 还需要 MBeanServer 引用。 但是,默认情况下,它会自动检查名为 的 Bean,与前面描述的通知侦听通道适配器相同。 下面的示例演示如何使用 XML 配置属性轮询通道适配器:object-name
attribute-name
mbeanServer
树轮询通道适配器
树轮询通道适配器查询 JMX MBean 树,并发送一条消息,其有效负载是与查询匹配的对象图。 默认情况下,MBean 映射到基元和简单对象,例如 、 和数组。 这样做允许简单转换为(例如)JSON。 还需要 MBeanServer 引用。 但是,默认情况下,它会自动检查名为 的 Bean,与前面描述的通知侦听通道适配器相同。 下面的示例演示如何使用 XML 配置树轮询通道适配器:Map
List
mbeanServer
前面的示例包括所选 MBean 上的所有属性。 您可以通过提供配置了适当过滤器的过滤器来筛选属性。 可以使用属性将转换器作为对 Bean 定义的引用提供,也可以使用内部定义。 Spring Integration 提供了一个可以在其构造函数参数中采用 a 的。MBeanObjectConverter
converter
DefaultMBeanObjectConverter
MBeanAttributeFilter
弹簧集成提供了两个标准过滤器。 允许您指定要包括的属性列表。 允许您指定要排除的属性列表。 您还可以实现自己的筛选器。NamedFieldsMBeanAttributeFilter
NotNamedFieldsMBeanAttributeFilter
操作调用通道适配器
操作调用通道适配器允许对 MBean 公开的任何托管操作进行消息驱动的调用。 每次调用都需要要调用的操作名称和目标 MBean 的对象名称。 这两者都必须分别由适配器配置或 via 和消息标头显式提供:JmxHeaders.OBJECT_NAME
JmxHeaders.OPERATION_NAME
然后适配器只需要能够发现 bean。 如果需要不同的 Bean 名称,请为该属性提供引用。mbeanServer
mbean-server
消息的有效负载映射到操作的参数(如果有)。 带有键的 -type 有效负载被视为名称/值对,而 or 数组作为简单的参数列表(没有显式参数名称)传递。 如果操作需要单个参数值,则有效负载可以表示该单个值。 此外,如果操作不需要参数,则有效负载将被忽略。Map
String
List
如果要公开一个通道,以便由不需要包含标头的消息调用单个常见操作,则最后一个选项效果很好。
操作调用出站网关
与操作调用通道适配器类似,Spring 集成也提供了一个操作调用的出站网关,当需要返回值时,您可以在处理非 void 操作时使用它。 返回值作为消息有效负载发送到网关指定的值。 以下示例演示如何使用 XML 配置操作调用的出站网关:reply-channel
如果未提供该属性,则回复消息将发送到标头标识的通道。 该标头通常由消息流的入口点(例如任何网关组件)自动创建。 但是,如果消息流是通过手动创建 Spring 集成消息并将其直接发送到通道来启动的,那么必须显式指定消息头或使用属性。reply-channel
IntegrationMessageHeaderAccessor.REPLY_CHANNEL
reply-channel
MBean 出口商
在配置 时,Spring 集成组件本身可能公开为 MBean。 要创建 的实例,请定义一个 Bean 并提供对 和 域名的引用(如果需要)。 您可以省略域,在这种情况下,默认域为 。 下面的示例演示如何声明 和关联实例的实例:IntegrationMBeanExporter
IntegrationMBeanExporter
MBeanServer
org.springframework.integration
IntegrationMBeanExporter
MBeanServer
MBean 导出器与 Spring 核心中提供的导出器正交。 它注册消息通道和消息处理程序,但不注册自身。 您可以使用标准标记公开导出器本身(以及 Spring 集成中的某些其他组件)。 导出器附加了一些指标,例如,处理程序数和排队消息数的计数。
它还具有有用的操作,如有序关闭托管操作中所述。
|
Spring Integration 4.0 引入了注释,以允许在类级别使用几个有用的选项方便地配置默认的 Bean。 以下示例演示如何配置此 Bean:@EnableIntegrationMBeanExport
integrationMbeanExporter
IntegrationMBeanExporter
@Configuration
如果您需要提供更多选项或有多个 bean(例如用于不同的 MBean 服务器或避免与标准 Spring 发生冲突(例如 through ),则可以将 配置为通用 bean。IntegrationMBeanExporter
MBeanExporter
@EnableMBeanExport
IntegrationMBeanExporter
MBean 对象名称
应用程序中的所有 、 和实例都由 MBean 导出器包装,以提供管理和监视功能。 下表列出了为每个组件类型生成的 JMX 对象名称:MessageChannel
MessageHandler
MessageSource
表 1.MBean 对象名称
组件类型 |
对象名称 |
消息通道 |
|
消息来源 |
|
消息处理程序 |
|
源和处理程序的对象名称中的属性采用下表中的值之一:bean
表 2.Bean 对象名称部分
豆子价值 |
描述 |
端点 |
封闭端点的 Bean 名称(例如),如果有 |
匿名 |
指示封闭端点没有用户指定的 Bean 名称,因此 JMX 名称是输入通道名称。 |
内部 |
对于众所周知的 Spring 集成默认组件 |
处理程序/源 |
以上都不是。 回退到被监视对象的方法(处理程序或源) |
您可以通过在属性中提供对对象的引用,将自定义元素追加到对象名称。Properties
object-name-static-properties
此外,从 Spring Integration 3.0 开始,您可以通过设置属性来使用自定义的对象命名策略。 这样做可以更好地控制 MBean 的命名,例如将所有集成 MBean 分组到“集成”类型下。 以下示例显示了一种可能的自定义命名策略实现:object-naming-strategy
参数是包含标准对象名称的参数,以 开头并包括任何其他静态属性。 前面的示例将标准部件移动到并将 设置为 “集成”,从而允许在一个查询中选择所有集成 MBean:“my.domain:type=Integration,*”。 这样做还可以将 bean 分组在 VisualVM 等工具中的域下的一个树条目下。beanKey
String
default-domain
type
componentType
type
默认命名策略是元数据命名策略。 导出器将 传播到该对象,以便在解析 Bean 键失败时生成回退对象名称。 如果自定义命名策略是 (或其子类),则导出器不会传播 . 您必须在策略 Bean 上配置它。 |
从版本 5.1 开始,如果任何 Bean 名称(由对象名称中的键表示)包含 Java 标识符(或句点)中不允许的任何字符,则将引用它们。name
.
JMX 改进
版本 4.2 引入了一些重要的改进,代表了对框架中 JMX 支持的相当大的修改。 这些显著提高了 JMX 统计信息收集的性能,并加强了对它们的控制。 但是,它对某些特定(不常见)情况下的用户代码有一些影响。 下面详细介绍了这些更改,必要时要谨慎。
@IntegrationManagedResource
与注释类似,这些将类标记为有资格导出为 MBean。 但是,仅当应用程序上下文具有 .@ManagedResource
@IntegrationManagedResource
IntegrationMBeanExporter
以前用 和 注释的某些 Spring 集成类(在 包中)现在用 和 注释。 这是为了向后兼容(请参阅下一项)。 此类 MBean 由任何上下文或 (但不能同时导出两者 — 如果两个导出器都存在,则 Bean 由集成导出器导出(如果 Bean 与模式匹配)导出)。org.springframework.integration
@ManagedResource
@ManagedResource
@IntegrationManagedResource
MBeanServer
IntegrationMBeanExporter
managed-components
MBean 导出器 Bean 名称模式
以前,模式仅包含。 如果 Bean 名称与其中一个模式匹配,则会包含该名称。 现在,可以通过在模式前面加上 来否定该模式。 例如, 匹配除 之外不以 开头的所有 Bean 名称。 从左到右评估模式。 第一个匹配(正或负)获胜,然后不应用进一步的模式。managed-components
!
!thing*, things
thing
things
将此语法添加到模式中会导致一个可能(尽管可能不太可能)的问题。 如果您有一个命名的 bean,并且您在 MBean 导出器的模式中包含了一个模式,则它不再匹配;该模式现在匹配所有未命名的 bean。 在这种情况下,您可以使用 转义模式中的 。 该模式与名为 的 Bean 匹配。 |
集成MBean导出器更改
不再实现 . 这意味着 和 操作不再可用于注册和注销 MBean。 MBean 现在在上下文初始化期间注册,在上下文销毁时取消注册。IntegrationMBeanExporter
SmartLifecycle
start()
stop()
有序关机管理操作
MBean 导出器允许 JMX 操作以有序方式关闭应用程序。 它旨在用于在停止 JVM 之前使用。 以下示例演示如何使用它:
有序关闭中介绍了它的使用和操作。