2.16. JMX 命名

概述

Apache Camel 允许您通过为其定义 管理名称模式 来自定义 CamelContext bean 的名称,使其显示为 JMX。例如,您可以自定义 XML CamelContext 实例的名称模式,如下所示:

<camelContext id="myCamel" managementNamePattern="#name#">
    ...
</camelContext>

如果您没有明确为 CamelContext bean 设置名称模式,Apache Camel 将还原为默认命名策略。

默认命名策略

默认情况下,COSC Context 部署在 OSGi 捆绑包中的 JMX 名称与捆绑包的 OSGi 符号链接名称相同。例如,如果 OSGi 符号链接名称是 MyCamelBundle,则 JMX 名称是 MyCamelBundle。如果捆绑包中有多个 CamelContext,则 JMX 名称通过添加计数器值作为后缀来消除。例如,如果 MyCamelBundle 捆绑包中有多个 Camel 上下文,则对应的 JMX MBeans 的名称如下:

MyCamelBundle-1
MyCamelBundle-2
MyCamelBundle-3
...

自定义 JMX 命名策略

默认命名策略的一个缺陷是不能保证给定 CamelContext bean 在运行后具有相同的 JMX 名称。如果要运行之间具有更高的一致性,您可以通过为 CamelContext 实例定义 JMX 名称模式 来更精确地控制 JMX 名称。

在 Java 中指定名称模式

要在 Java 中指定 CamelContext 的名称模式,请调用 setNamePattern 方法,如下所示:

// Java
context.getManagementNameStrategy().setNamePattern("#name#");

在 XML 中指定名称模式

要在 XML 中指定 CamelContext 的名称模式,请在 camelContext 元素上设置 managementNamePattern 属性,如下所示:

<camelContext id="myCamel" managementNamePattern="#name#">

名称模式令牌

您可以通过将字面文本和以下任意令牌混合使用 JMX 名称模式:

表 2.11. JMX Name Pattern Tokens

令牌描述

#camelId#

CamelContext bean 上的 id 属性的值。

#name#

#camelId# 相同。

#counter#

递增计数器(从 1开始)。

#bundleId#

已部署捆绑包的 OSGi 捆绑包 ID (仅OSGi)。

#symbolicName#

OSGi 符号链接名称 (仅OSGi)。

#version#

OSGi 捆绑版本 (仅限OSGi)

例子

以下是您可以使用支持的令牌定义的 JMX 名称模式的一些示例:

<camelContext id="fooContext" managementNamePattern="FooApplication-#name#">
    ...
</camelContext>
<camelContext id="myCamel" managementNamePattern="#bundleID#-#symbolicName#-#name#">
    ...
</camelContext>

模糊名称

由于自定义命名模式会覆盖默认命名策略,因此可以使用此方法定义模糊的 JMX MBean 名称。例如:

<camelContext id="foo" managementNamePattern="SameOldSameOld"> ... </camelContext>
...
<camelContext id="bar" managementNamePattern="SameOldSameOld"> ... </camelContext>

在这种情况下,Apache Camel 无法启动并报告 MBean 已存在 异常。因此,您应该格外小心,以确保您没有定义模糊的名称模式。