|
该版本仍在开发中,尚未被视为稳定。对于最新的稳定版本,请使用 Spring Integration 7.0.0! |
JMX 支持
Spring Integration提供通道适配器用于接收和发布JMX通知。
你需要把这种依赖性纳入你的项目中:
-
Maven
-
Gradle
<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作。
通知监听频道适配器
通知监听通道适配器需要 JMX 接口对象名称对于发布该监听者应注册通知的MBean。
一个非常简单的配置可能如下:
<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豆名产生了以下示例:
<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径直。 它不需要任何轮询器配置。
|
仅对于该组件,
当启用调试级别日志时,所在的MBean的名称会被记录。 |
通知发布通道适配器
通知发布通道适配器相对简单。其配置中只需一个JMX对象名称,如下示例所示:
<context:mbean-export/>
<int-jmx:notification-publishing-channel-adapter id="adapter"
channel="channel"
object-name="example.domain:name=publisher"/>
它还要求MBean出口商要在语境中存在。这就是为什么<context:mbean-export/>元素也在前面的例子中显示。
当消息发送到该适配器的信道时,通知是根据消息内容生成的。如果有效载荷是字符串,它传递为消息通知文本。任何其他有效载荷类型都作为用户数据通知。
JMX 通知还有一个类型,并且应该是一个点分隔的字符串. 有两种方式可以提供类型. 优先级总是赋予与JmxHeaders.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中任何其他轮询适配器一样配置轮询器(或者依赖默认轮询器)。 这对象名称以及属性-名称是必需的。MBeanServer 也需要引用。不过,默认情况下,它会自动检查一个名为mbeanServer,与之前描述的通知监听通道适配器相同。以下示例展示了如何使用XML配置属性轮询通道适配器:
<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配置树轮询通道适配器:
<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 Integration 提供两种标准Filter。 这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"/>
那么适配器只需要能够发现mbeanServer豆。
如果需要不同的豆名,请提供mbean-server属性并附有引用。
消息的有效载荷映射到作参数(如有)。
一个地图- 类型有效载荷字符串键被视为名称/值对,而列表或数组作为简单的参数列表传递(无显式参数名)。
如果作需要单一参数值,载荷可以表示该单一值。
此外,如果作不需要参数,有效载荷将被忽略。
如果你想为一个普通作暴露通道,让不需要包含报头的消息调用,最后一个选项效果很好。
作调用出站网关
类似于作调用通道适配器,Spring Integration也提供作调用出站网关,当需要返回值时,你可以在处理非无效作时使用它。
返回值作为消息有效载荷发送给回复信道由网关指定。
以下示例展示了如何使用XML配置作调用的出站网关:
<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 集成消息并直接发送到通道开始的,你必须明确指定消息头部或使用回复信道属性。
MBean 出口商
当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提供的导出器是正交的。
它会注册消息通道和消息处理程序,但不注册自身。
你可以通过使用标准暴露导出器本身(以及 Spring 集成中的某些其他组件) 它还有一个有用的作,如有序关闭管理作中所述。 |
Spring Integration 4.0 引入了@EnableIntegrationMBeanExport注释以便方便配置默认值integrationMbeanExporter类型豆IntegrationMBeanExporter在@Configuration班级层级。
以下示例展示了如何配置这个豆子:
@Configuration
@EnableIntegration
@EnableIntegrationMBeanExport(server = "mbeanServer", managedComponents = "input")
public class ContextConfiguration {
@Bean
public MBeanServerFactoryBean mbeanServer() {
return new MBeanServerFactoryBean();
}
}
如果你需要提供更多选项,或者有多个选项IntegrationMBeanExporter豆子(例如用于不同的MBean服务器,或避免与标准Spring的冲突MBean出口商——例如@EnableMBeanExport),你可以配置一个IntegrationMBeanExporter作为普通豆子。
MBean 对象名称
所有的消息频道,消息处理器和消息源应用中的实例由MBean导出器封装,以提供管理和监控功能。
每种组件类型的生成 JMX 对象名称列于下表:
| 组件类型 | 物体名称 |
|---|---|
消息频道 |
`o.s.i:type=MessageChannel,name=<channelName>` |
消息源 |
`o.s.i:type=MessageSource,name=<channelName>,bean=<source>` |
消息处理器 |
`o.s.i:type=MessageSource,name=<channelName>,bean=<source>` |
这豆源和处理器对象名称中的属性取下表中的某个值:
| 豆子价值 | 描述 |
|---|---|
端点 |
围括端点的豆名(例如) |
匿名 |
表示包围端点没有用户指定的豆名,因此JMX名称是输入通道名称。 |
内部 |
对于知名的 Spring 集成默认组件 |
处理员/来源 |
以上都不是。
撤退至...... |
你可以通过提供对性能对象在对象名静态属性属性。
另外,自从 Spring Integration 3.0 起,你可以用自定义软件对象命名策略通过设置对象命名策略属性。
这样做可以更好地控制MBean的命名,比如将所有集成MBean归入“Integration”类型。
以下示例展示了一种可能的自定义命名策略实现:
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 等工具中。
默认命名策略是元数据命名策略.
出口商传播默认域名让该对象在解析 bean 键失败时生成一个备用对象名。
如果你的自定义命名策略是元数据命名策略(或其子类),出口者不会传播默认域名.
你必须在你的战略豆上配置它。 |
从5.1版本开始,任何Beans名称(用名称如果 key 在对象名中包含任何不允许出现在 Java 标识符(或句号)中的字符,则会被引用.).
JMX改进
4.2 版本引入了一些重要改进,代表了框架中 JMX 支持的相当重大的革新。 这些措施显著提升了JMX统计数据收集的性能,并大大提升了对其的控制。 然而,它在少数特定(不常见)情况下对用户代码有一定影响。 这些变化详述如下,必要时需谨慎说明。
- @IntegrationManagedResource
-
类似于
@ManagedResource注释,@IntegrationManagedResource标记该类别有资格作为MBean出口。 然而,只有当应用上下文具有IntegrationMBeanExporter.某些 Spring 集成类(在
org.springframework.integration)package)之前被注释为@ManagedResource现在都被注释为@ManagedResource和@IntegrationManagedResource. 这是为了向下兼容(见下一条)。 此类MBean可被导出至任何上下文MBeanServer或由IntegrationMBeanExporter(但不会两者同时出现——如果两个出口者都存在,则积分出口器会对豆子进行输出,且豆子与托管组件模式)。 - MBean 出口豆名称模式
-
此前,
托管组件模式仅限于包容性。 如果豆子名字与其中一个图案相符,就会被包含进去。 现在,可以通过在前缀 以 来否定该模式!. 例如!东西*,东西匹配所有非以 开头的Beans名称东西除了事情. 模式从左到右进行评估。 第一个匹配(正负)获胜,之后不再应用其他模式。将这种语法加入模式会带来一个可能(虽然不太可能)的问题。 如果你有一颗叫做 “!东西”你包含了一个模式!东西在你的MBean导出商中托管组件模式不再匹配;现在图案与所有未命名的豆子相匹配东西. 在这种情况下,你可以跳出!在与 的模式中。 这\\!东西图案匹配一个名为!东西. - 集成MBean导出器变更
-
这
IntegrationMBeanExporter不再实现SmartLifecycle. 这意味着开始()和停止()不再可用于注册和取消注册 MBeans。 MBean 在上下文初始化时注册,上下文被销毁时取消注册。
有序停机管理运营
MBean 导出器允许 JMX作有序地关闭应用程序。 它设计用于停止JVM之前。 以下示例展示了如何使用它:
public void stopActiveComponents(long howLong)
其使用和作详见《有序关机》一书。