180.6.4. 管理命名模式
可从 Camel 2.10 开始
从 Camel 2.10 开始,我们更加容易地为 MBeans 配置命名模式。该模式作为 ObjectName
的一部分被用作域名后的键。
默认情况下,CamelContextMBean 将 MBean 名称用于 ManagedCamelContextMBean
,如下所示:
org.apache.camel:context=localhost/camel-1,type=context,name=camel-1
org.apache.camel:context=localhost/camel-1,type=context,name=camel-1
从 Camel 2.13 开始主机名不包括在 MBean 名称中,因此上述示例如下:
org.apache.camel:context=camel-1,type=context,name=camel-1
org.apache.camel:context=camel-1,type=context,name=camel-1
如果您在 CamelContext
上配置名称,则该名称也是 ObjectName
的一部分。例如,如果我们有
<camelContext id="myCamel" ...>
<camelContext id="myCamel" ...>
然后 MBean 名称将如下:
org.apache.camel:context=localhost/myCamel,type=context,name=myCamel
org.apache.camel:context=localhost/myCamel,type=context,name=myCamel
现在,如果 JVM 中有一个命名 clash (例如,已存在上述给定名称的 MBean),那么 Camel 默认会尝试通过使用计数器在 JMXMBeanServer
中查找新的可用名称来自动纠正此操作。如上所示,现在附加计数器,因此我们将 myCamel-1
作为 ObjectName
的一部分:
org.apache.camel:context=localhost/myCamel-1,type=context,name=myCamel
org.apache.camel:context=localhost/myCamel-1,type=context,name=myCamel
这是因为 Camel 默认使用命名模式来支持以下令牌:
-
camelId
= CamelContext id (如名称) -
name
- 与camelId
相同 -
counter
- 递增计数器* bundleId
- OSGi 捆绑包 ID (仅适用于 OSGi 环境) -
符号名称
- OSGi 符号链接名称(仅适用于 OSGi 环境) -
版本
- OSGi 捆绑版本(仅适用于 OSGi 环境)
默认命名模式在 OSGi 和非OSGi 不同,如下所示:
-
non OSGI:
name
-
OSGi:
bundleId-name
-
OSGi Camel 2.13:
符号名称
但是,如果在 JMXMBeanServer
中有一个命名 clash,Camel 将自动回退,并在 模式中使用计数器
来补救此问题。因此将使用以下模式:
-
non OSGI:
name-counter
-
OSGi:
bundleId-name-counter
-
OSGi Camel 2.13:
符号名称-计数器
如果您设置了显式命名模式,那么始终使用该模式,并且不 使用上述默认模式。
这样,我们可以在 JMXMBeanRegistry
中对 CamelContext
id 命名以及 JMXMBeans 的命名变得非常容易。
从 Camel 2.15 开始,您可以使用 JVM 系统属性配置默认管理名称模式,为 JVM 配置这一全局配置。请注意,您可以通过显式配置此模式来覆盖它,如下例所示。
设置 JVM 系统属性,以使用 cool 为名称加上前缀的默认管理名称模式。
System.setProperty(JmxSystemPropertyKeys.MANAGEMENT_NAME_PATTERN, "cool-#name#");
System.setProperty(JmxSystemPropertyKeys.MANAGEMENT_NAME_PATTERN, "cool-#name#");
因此,如果我们希望明确命名 CamelContext
并使用固定的 MBean 名称,该名称不会更改(例如,没有计数器),那么我们可以使用新的 managementNamePattern
属性:
<camelContext id="myCamel" managementNamePattern="#name#">
<camelContext id="myCamel" managementNamePattern="#name#">
然后 MBean 名称始终如下所示:
org.apache.camel:context=localhost/myCamel,type=context,name=myCamel
org.apache.camel:context=localhost/myCamel,type=context,name=myCamel
在 Java 中,您可以配置 managementNamePattern
,如下所示:
context.getManagementNameStrategy().setNamePattern("#name#");
context.getManagementNameStrategy().setNamePattern("#name#");
您还可以使用与 id 的 managementNamePattern
中的不同名称,例如我们可以:
<camelContext id="myCamel" managementNamePattern="coolCamel">
<camelContext id="myCamel" managementNamePattern="coolCamel">
如果您不希望 OSGi 捆绑包 ID 作为 MBean 名称的一部分,您可能希望在 OSGi 环境中执行此操作。由于 OSGi 捆绑包 id 可更改服务器,或者卸载并安装相同的应用程序。然后您可以按如下所示不要使用 OSGi 捆绑包 ID 作为名称的一部分:
<camelContext id="myCamel" managementNamePattern="#name#">
<camelContext id="myCamel" managementNamePattern="#name#">
请注意,这需要 myCamel
在整个 JVM 中是唯一的。如果安装了具有相同 CamelContext
id 和 managementNamePattern
的 2nd Camel 应用程序,那么 Camel 将在启动时失败,并报告 MBean 已存在的异常。