2.16. JMX 命名

概述

通过为它定义管理名称,Apache Camel 允许您自定义 CamelContext 的名称 (其出现在 JMX 中)。例如,您可以自定义 XML CamelContext 实例的名称模式,如下所示:

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

如果您没有明确为 CamelContext an 设置名称模式,Apache Camel 将恢复为默认的命名策略。

默认命名策略

默认情况下,在 OSGi 捆绑包中部署的 CamelContext 名称等于该捆绑包的 OSGi 符号链接名称。例如,如果 OSGi 符号链接名称为 MyCamelBundle,则 JMX 名称是 MyCamelBundle。如果捆绑包中有多个 CamelContext,则将计数器值添加为后缀,则 JMX 名称不会被混淆。例如,如果 MyCamelBundle 捆绑包中有多个 Camel 上下文,则对应的 JMX MBeans 命名如下:

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

自定义 JMX 命名策略

默认命名策略的一个缺陷是,您不能保证给定 CamelContext an 在运行之间具有相同的 JMX 名称。如果您想在不同运行之间具有更高的一致性,您可以通过为 CamelContext 实例定义 JMX name 模式,以更精确地控制 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 已经存在 异常。因此,您应该要格外小心,确保您没有定义模糊的名称模式。