Spring 集成提供了用于接收和发布 JMX 通知的通道适配器。
您需要将此依赖项包含在您的项目中:
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-jmx</artifactId>
<version>6.3.4</version>
</dependency>
compile "org.springframework.integration:spring-integration-jmx:6.3.4"
入站通道适配器允许轮询 JMX MBean 属性值,出站通道适配器允许调用 JMX MBean 操作。
通知侦听通道适配器
通知侦听通道适配器需要 MBean 的 JMX,该 JMX 发布此侦听器应注册到的通知。
一个非常简单的配置可能类似于以下内容:ObjectName
<int-jmx:notification-listening-channel-adapter id="adapter"
channel="channel"
object-name="example.domain:name=publisher"/>
在启动时注册,默认的 bean 名称是 ,这恰好是使用 Spring 的元素时生成的相同 bean 名称。
如果需要使用其他名称,请务必包含该属性。notification-listening-channel-adapter MBeanServer mbeanServer <context:mbean-server/> mbean-server |
适配器还可以接受对 a 和 “handback” 对象的引用,以提供随每个通知传回的一些上下文。
这两个属性都是可选的。
扩展前面的示例以包括这些属性以及显式 bean 名称,将生成以下示例:NotificationFilter
MBeanServer
<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侦听通道适配器是事件驱动的,并直接向 注册。
它不需要任何 poller 配置。MBeanServer
仅对于此组件,该属性可以包含对象名称模式(例如
“org.something:type=MyType,name=*”)。
在这种情况下,适配器将从对象名称与模式匹配的所有 MBean 接收通知。
此外,该属性可以包含对对象名称模式的 SPEL 引用,如下例所示:
启用 DEBUG 级别日志记录时,将记录找到的 MBean 的名称。 |
在启动时注册,默认的 bean 名称是 ,这恰好是使用 Spring 的元素时生成的相同 bean 名称。
如果需要使用其他名称,请务必包含该属性。notification-listening-channel-adapter MBeanServer mbeanServer <context:mbean-server/> mbean-server |
仅对于此组件,该属性可以包含对象名称模式(例如
“org.something:type=MyType,name=*”)。
在这种情况下,适配器将从对象名称与模式匹配的所有 MBean 接收通知。
此外,该属性可以包含对对象名称模式的 SPEL 引用,如下例所示:
启用 DEBUG 级别日志记录时,将记录找到的 MBean 的名称。 |
通知发布通道适配器
通知发布通道适配器相对简单。 它的配置中只需要一个 JMX 对象名称,如下例所示:
<context:mbean-export/>
<int-jmx:notification-publishing-channel-adapter id="adapter"
channel="channel"
object-name="example.domain:name=publisher"/>
它还要求 an 出现在上下文中。
这就是为什么前面的示例中也显示了该元素的原因。MBeanExporter
<context:mbean-export/>
当消息发送到此适配器的通道时,将从消息内容创建通知。
如果有效负载是 ,则将其作为通知的文本传递。
任何其他有效负载类型将作为通知的 传递。String
message
userData
JMX 通知也有一个 ,它应该是点分隔的 。
有两种方法可以提供 .
始终为与键关联的消息报头值提供优先级。
或者,您可以在配置中提供 fallback 属性,如下例所示:type
String
type
JmxHeaders.NOTIFICATION_TYPE
default-notification-type
<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 中的任何其他 polling 适配器一样配置 Poller(或者你可以依赖默认的 Poller)。
和 是必需的。
还需要 MBeanServer 引用。
但是,默认情况下,它会自动检查名为 的 bean,与前面描述的通知侦听通道适配器相同。
下面的示例展示了如何使用 XML 配置属性轮询通道适配器:object-name
attribute-name
mbeanServer
<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 配置树轮询通道适配器:Map
List
mbeanServer
<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 集成提供了一个可以在其构造函数参数中接受 a 的 a。MBeanObjectConverter
converter
<bean/>
DefaultMBeanObjectConverter
MBeanAttributeFilter
Spring 集成提供了两个标准过滤器。
用于指定要包含的属性列表。
允许您指定要排除的属性列表。
您还可以实现自己的过滤器。NamedFieldsMBeanAttributeFilter
NotNamedFieldsMBeanAttributeFilter
操作调用通道适配器
操作调用通道适配器支持对 MBean 公开的任何托管操作进行消息驱动调用。
每次调用都需要调用的操作名称和目标 MBean 的对象名称。
这两者都必须分别由适配器配置或通过和消息标头显式提供:JmxHeaders.OBJECT_NAME
JmxHeaders.OPERATION_NAME
<int-jmx:operation-invoking-channel-adapter id="adapter"
object-name="example.domain:name=TestBean"
operation-name="ping"/>
然后,适配器只需要能够发现 bean。
如果需要其他 Bean 名称,则为该属性提供引用。mbeanServer
mbean-server
消息的有效负载将映射到操作的参数(如果有)。
带有键的 -typed payload 被视为名称/值对,而 or 数组作为简单参数列表传递(没有明确的参数名称)。
如果操作需要单个参数值,则有效负载可以表示该单个值。
此外,如果操作不需要任何参数,则有效负载将被忽略。Map
String
List
如果要为不需要包含 Headers 的消息公开单个常见操作的通道,则最后一个选项效果很好。
操作调用出站网关
与操作调用通道适配器类似, Spring 集成也提供了一个操作调用出站网关,当需要返回值时,你可以在处理非void操作时使用该网关。
返回值将作为消息负载发送到网关指定的值。
以下示例显示如何使用 XML 配置操作调用出站网关:reply-channel
<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"/>
如果未提供该属性,则回复消息将发送到由 Headers 标识的通道。
该标头通常由消息流的入口点(例如任何网关组件)自动创建。
但是,如果消息流是通过手动创建 Spring Integration 消息并将其直接发送到通道来启动的,则必须显式指定消息头或使用该属性。reply-channel
IntegrationMessageHeaderAccessor.REPLY_CHANNEL
reply-channel
MBean 导出器
Spring 集成组件本身可以在配置时作为 MBean 公开。
要创建 的实例,请定义一个 Bean 并提供对 an 和 域名的引用(如果需要)。
您可以省略域,在这种情况下,默认域为 .
下面的示例演示如何声明 an 和 a associated instance 的实例:IntegrationMBeanExporter
IntegrationMBeanExporter
MBeanServer
org.springframework.integration
IntegrationMBeanExporter
MBeanServer
<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 中提供的导出器正交。
它注册消息通道和消息处理程序,但不注册自身。
你可以通过使用standard标签来公开导出器本身(以及 Spring Integration 中的某些其他组件)。
导出器附加了一些指标 — 例如,处理程序数量和排队消息数量的计数。 它还具有一个有用的操作,如 Orderly Shutdown Managed Operation 中所述。 |
Spring Integration 4.0 引入了 Comments,以允许方便地配置默认 bean 类型,并在类级别使用几个有用的选项。
以下示例显示如何配置此 Bean:@EnableIntegrationMBeanExport
integrationMbeanExporter
IntegrationMBeanExporter
@Configuration
@Configuration
@EnableIntegration
@EnableIntegrationMBeanExport(server = "mbeanServer", managedComponents = "input")
public class ContextConfiguration {
@Bean
public MBeanServerFactoryBean mbeanServer() {
return new MBeanServerFactoryBean();
}
}
如果需要提供更多选项或拥有多个 bean(例如用于不同的 MBean 服务器或避免与标准 Spring 冲突 — 例如 through),则可以将 配置为通用 bean。IntegrationMBeanExporter
MBeanExporter
@EnableMBeanExport
IntegrationMBeanExporter
MBean 对象名称
应用程序中的所有 、 和 实例都由 MBean 导出程序包装,以提供管理和监控功能。
下表列出了为每种组件类型生成的 JMX 对象名称:MessageChannel
MessageHandler
MessageSource
组件类型 | 对象名称 |
---|---|
MessageChannel 消息频道 |
`o.s.i:type=MessageChannel,name=<channelName>` |
消息源 |
`o.s.i:type=MessageSource,name=<channelName>,bean=<source>` |
MessageHandler 消息处理器 |
`o.s.i:type=MessageSource,name=<channelName>,bean=<source>` |
源和处理程序的对象名称中的属性采用下表中的值之一:bean
Bean 值 | 描述 |
---|---|
端点 |
封闭端点的 bean 名称(例如 ),如果有的话 |
匿名 |
指示封闭端点没有用户指定的 bean 名称,因此 JMX 名称是 input 通道名称。 |
内部 |
对于众所周知的 Spring 集成默认组件 |
处理程序/源 |
以上都不是。
回退到被监控对象的方法(处理程序或源) |
您可以通过在属性中提供对对象的引用,将自定义元素附加到对象名称中。Properties
object-name-static-properties
此外,从 Spring Integration 3.0 开始,你可以通过设置属性来使用自定义ObjectNamingStrategy
。
这样做可以更好地控制 MBean 的命名,例如将所有集成 MBean 分组到“Integration”类型下。
以下示例显示了一种可能的自定义命名策略实现:object-naming-strategy
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' 并将其设置为 'Integration',从而允许在一个查询中选择所有集成 MBean:'my.domain:type=Integration,*'。
这样做还会将 bean 分组到诸如 VisualVM 之类的工具中域下的一个树条目下。beanKey
String
default-domain
type
componentType
type
默认命名策略是 MetadataNamingStrategy 。
导出器将 传播到该对象,以便在解析 bean 键失败时生成回退对象名称。
如果您的自定义命名策略是 a(或其子类),则导出器不会传播 .
您必须在策略 Bean 上配置它。default-domain MetadataNamingStrategy default-domain |
从版本 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 名称。 现在,可以通过在模式前加上 . 例如,匹配所有不以 except 开头的 bean 名称。 模式从左到右进行评估。 第一个匹配项 (正或负) 获胜,然后不再应用其他模式。
managed-components
!
!thing*, things
thing
things
将此语法添加到模式中会导致一个可能的(尽管可能不太可能)问题。 如果你有一个名为 bean 的 bean,并且你在 MBean 导出器的模式中包含了 of,那么它不再匹配;该模式现在匹配所有未命名的 bean。 在这种情况下,您可以使用 . 该模式与名为 . "!thing"
!thing
managed-components
thing
!
\
\!thing
!thing
- IntegrationMBeanExporter 更改
-
不再实现 . 这意味着 and 操作不再可用于注册和注销 MBean。 现在,MBean 在上下文初始化期间注册,并在销毁上下文时取消注册。
IntegrationMBeanExporter
SmartLifecycle
start()
stop()
Orderly Shutdown 托管操作
MBean 导出器允许 JMX 操作有序地关闭应用程序。 它旨在用于停止 JVM 之前。 以下示例演示如何使用它:
public void stopActiveComponents(long howLong)
它的使用和操作在 Orderly Shutdown 中介绍。
MBean 导出器与 Spring core 中提供的导出器正交。
它注册消息通道和消息处理程序,但不注册自身。
你可以通过使用standard标签来公开导出器本身(以及 Spring Integration 中的某些其他组件)。
导出器附加了一些指标 — 例如,处理程序数量和排队消息数量的计数。 它还具有一个有用的操作,如 Orderly Shutdown Managed Operation 中所述。 |
组件类型 | 对象名称 |
---|---|
MessageChannel 消息频道 |
`o.s.i:type=MessageChannel,name=<channelName>` |
消息源 |
`o.s.i:type=MessageSource,name=<channelName>,bean=<source>` |
MessageHandler 消息处理器 |
`o.s.i:type=MessageSource,name=<channelName>,bean=<source>` |
Bean 值 | 描述 |
---|---|
端点 |
封闭端点的 bean 名称(例如 ),如果有的话 |
匿名 |
指示封闭端点没有用户指定的 bean 名称,因此 JMX 名称是 input 通道名称。 |
内部 |
对于众所周知的 Spring 集成默认组件 |
处理程序/源 |
以上都不是。
回退到被监控对象的方法(处理程序或源) |
默认命名策略是 MetadataNamingStrategy 。
导出器将 传播到该对象,以便在解析 bean 键失败时生成回退对象名称。
如果您的自定义命名策略是 a(或其子类),则导出器不会传播 .
您必须在策略 Bean 上配置它。default-domain MetadataNamingStrategy default-domain |
将此语法添加到模式中会导致一个可能的(尽管可能不太可能)问题。
如果你有一个名为 bean 的 bean,并且你在 MBean 导出器的模式中包含了 of,那么它不再匹配;该模式现在匹配所有未命名的 bean。
在这种情况下,您可以使用 .
该模式与名为 ."!thing" !thing managed-components thing ! \ \!thing !thing |