180.6. 将 JMX 用于您自己的 Camel 代码
180.6.1. 注册您自己的受管端点 复制链接链接已复制到粘贴板!
从 Camel 2.0
开始,您可以使用 Spring managed annotations @ManagedResource
分离自己的端点,以允许在 Camel MBeanServer
中注册它们,从而使用 JMX 访问您的自定义 MBeans。
在 Camel 2.1 中,我们进行了修改以仅应用端点,但还需要实施接口 org.apache.camel.spi.ManagementAware
。有关此问题的更多信息。
例如,我们有以下自定义端点,其中我们定义了一些要管理的选项:
从 Camel 2.9 开始,它鼓励使用 org.apache.camel.api.management
软件包中的 @ManagedResource
、@ManagedAttribute
和 @ManagedOperation
。这允许您的自定义代码不依赖于 Spring JAR。
180.6.2. 编程您自己的受管服务 复制链接链接已复制到粘贴板!
从 Camel 2.1 开始提供
Camel 现在提供在注册服务以进行管理时使用您自己的 MBeans。例如,您可以开发一个自定义 Camel 组件,并让它为端点、消费者和生产者等公开 MBeans。您需要做的都是实施 org.apache.camel.spi.ManagementAware
的接口,并返回受管对象 Camel 使用。
现在,在想一下 JMX API 之前,非常困难且可行,然后您是正确的。对于我们 Spring,但对于 Spring,它们也创建了一系列注释,可用于导出现有 bean 的管理。这意味着,您通常使用它,且只在 ManagementAware
接口的 getManagedObject
中返回它。有关示例,请参阅上面的
CustomEndpoint
的代码示例。
现在,在 Camel 2.1 中,您可以为 Camel 寄存器管理的所有对象执行此操作,这些对象非常大,但不是全部。
对于没有实现这个 ManagementAware
接口的服务,Camel 将回退到使用下表中定义的默认打包程序:
类型 | MBean 包装器 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
另外,还有一些用于特殊类型的扩展打包程序,例如:
类型 | MBean 包装器 |
---|---|
|
|
|
|
|
|
|
|
|
|
未来,我们将为更多 EIP 模式添加额外的打包程序。
180.6.3. ManagementNamingStrategy 复制链接链接已复制到粘贴板!
从 Camel 2.1 开始提供
Camel 通过 org.apache.camel.spi.ManagementNamingStrategy
为命名策略提供了一个可插拔 API。默认的实现用于计算所有 MBeans 注册到的 MBean 名称。
180.6.4. 管理命名模式 复制链接链接已复制到粘贴板!
从 Camel 2.10 开始提供
从 Camel 2.10 开始,我们可让您更轻松地为 MBeans 配置命名模式。该模式在域名后用作 ObjectName
的一部分。
默认情况下,Camel 将对 ManagedCamelContextMBean
使用 MBean 名称,如下所示:
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 中有一个命名冲突,例如,已有上面给定名称的 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 环境) -
symbolicName
- OSGi 符号名称(仅适用于 OSGi 环境) -
版本
- OSGi 捆绑包版本(仅适用于 OSGi 环境)
默认命名模式在 OSGi 和非 OSGi 间区分,如下所示:
-
非 OSGI:
名称
-
osgi:
bundleId-name
-
OSGi Camel 2.13:
symbolicName
但是,如果 JMXMBeanServer
中有一个命名冲突,则 Camel 将自动回退,并使用 模式中的计数器
来补救这一点。因此,将使用以下模式:
-
非 OSGI:
name-计数器
-
osgi:
bundleId-name-counter
-
OSGi Camel 2.13:
symbolicName-counter
如果您设置了显式命名模式,则始终使用该模式,并且不使用 上述默认模式。
这样,我们可以完全掌控在 Registry 中的 CamelContext
id 以及 JMXMBeanRegistry
中的 JMX MBeans 的命名。
从 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#");
您还可以在 managementNamePattern
than the id 中使用不同的名称,例如,我们可以进行:
<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 已存在异常。
180.6.5. ManagementStrategy 复制链接链接已复制到粘贴板!
从 Camel 2.1 开始提供
Camel 现在提供了一个完整的可插拔管理策略,允许您 100% 来控制管理。这是一个丰富的界面,具有许多管理方法。不仅从 MBeanServer
添加和删除管理对象,也提供了事件通知,也使用 org.apache.camel.spi.EventNotifier
API 提供。例如,它可以更轻松地为其他管理产品提供适配器。此外,它还允许您提供 Apache 开箱即用的更多详细信息和功能。
180.6.6. 为性能统计配置粒度级别 复制链接链接已复制到粘贴板!
从 Camel 2.1 开始提供
现在,您可以设置一个预先设置级别,无论是启用性能统计,还是在 Camel 启动时是否启用。级别是
-
Extended
- 作为默认功能,但在运行时收集的额外统计数据,如精细地使用端点等。这个选项需要 Camel 2.16 -
All
/Default
- Camel 将为路由和处理器(细粒度)启用统计信息。从 Camel 2.16 开始,All 选项被重命名为 Default。 -
RoutesOnly
- Camel 只会为路由启用统计信息(粗粒度) -
off
- Camel 不会为任何启用统计信息。
从 Camel 2.9 开始,性能统计还包括每个 CamelContext 和 Route MBeans 的平均负载统计信息。统计基于动态交换的数量、每 1、5 和 15 分钟速率的平均负载。这类似于 Unix 系统上的负载统计信息。Camel 2.11 以后,您可以通过在 < jmxAgent> 上设置
禁用负载性能统计信息。请注意,如果静态级别也被配置为 off,它将会被关闭。默认情况下,在 Camel 2.13 开始,负载性能统计被禁用。您可以通过在 < loadStatisticsEnabled=false
来显式jmxAgent> 中设置
。
loadStatisticsEnabled=true
来启用它
在运行时,您始终可以使用管理控制台(如 JConsole)更改给定路由或处理器上是否启用其统计信息。
启用统计数据的含义是什么?
启用统计数据意味着 Camel 针对特定 MBean 执行精细的性能统计信息。您可以看到的统计数据有很多,例如:已完成的交换数/失败数、last/total/mina/max/mean 处理时间、第一次/最后失败时间等。
使用 Java DSL,您可以通过以下方法设置这个级别:
// only enable routes when Camel starts context.getManagementStrategy().setStatisticsLevel(ManagementStatisticsLevel.RoutesOnly);
// only enable routes when Camel starts
context.getManagementStrategy().setStatisticsLevel(ManagementStatisticsLevel.RoutesOnly);
在 Spring DSL 中:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> <jmxAgent id="agent" statisticsLevel="RoutesOnly"/> ... </camelContext>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<jmxAgent id="agent" statisticsLevel="RoutesOnly"/>
...
</camelContext>