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。有关此问题的更多信息。

例如,我们有以下自定义端点,其中我们定义了一些要管理的选项:

@ManagedResource(description = "Our custom managed endpoint")
public class CustomEndpoint extends MockEndpoint implements ManagementAware<CustomEndpoint> {

    public CustomEndpoint(final String endpointUri, final Component component) {
        super(endpointUri, component);
    }

    public Object getManagedObject(CustomEndpoint object) {
        return this;
    }

    public boolean isSingleton() {
        return true;
    }

    protected String createEndpointUri() {
        return "custom";
    }

    @ManagedAttribute
    public String getFoo() {
        return "bar";
    }

    @ManagedAttribute
    public String getEndpointUri() {
        return super.getEndpointUri();
    }
}
Copy to Clipboard Toggle word wrap

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 将回退到使用下表中定义的默认打包程序:

Expand
类型MBean 包装器

CamelContext

ManagedCamelContext

组件

ManagedComponent

端点

ManagedEndpoint

消费者

ManagedConsumer

制作者

ManagedProducer

Route

ManagedRoute

处理器

ManagedProcessor

tracer

ManagedTracer

服务

ManagedService

另外,还有一些用于特殊类型的扩展打包程序,例如:

Expand
类型MBean 包装器

ScheduledPollConsumer

ManagedScheduledPollConsumer

BrowsableEndpoint

ManagedBrowseableEndpoint

Throttler

ManagedThrottler

Delayer

ManagedDelayer

SendProcessor

ManagedSendProcessor

未来,我们将为更多 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
Copy to Clipboard Toggle word wrap

Camel 2.13 开始,主机名不包括在 MBean 名称中,因此上例如下:

org.apache.camel:context=camel-1,type=context,name=camel-1
Copy to Clipboard Toggle word wrap

如果您在 CamelContext 上配置名称,则该名称也是 ObjectName 的一部分。例如,如果我们有

<camelContext id="myCamel" ...>
Copy to Clipboard Toggle word wrap

然后 MBean 名称如下:

org.apache.camel:context=localhost/myCamel,type=context,name=myCamel
Copy to Clipboard Toggle word wrap

现在,如果 JVM 中有一个命名冲突,例如,已有上面给定名称的 MBean,则 Camel 默认会尝试通过使用计数器在 JMXMBeanServer 中查找新的自由名称来自动修正这一点。如现在附加了计数器,因此将 myCamel-1 作为 ObjectName 的一部分:

org.apache.camel:context=localhost/myCamel-1,type=context,name=myCamel
Copy to Clipboard Toggle word wrap

这是因为 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#");
Copy to Clipboard Toggle word wrap

因此,如果我们希望显式命名 CamelContext 并使用固定的 MBean 名称,这不会改变(例如没有计数器),那么我们可以使用新的 managementNamePattern 属性:

<camelContext id="myCamel" managementNamePattern="#name#">
Copy to Clipboard Toggle word wrap

然后 MBean 名称将始终如下:

org.apache.camel:context=localhost/myCamel,type=context,name=myCamel
Copy to Clipboard Toggle word wrap

在 Java 中,您可以按照以下方法配置 managementNamePattern

context.getManagementNameStrategy().setNamePattern("#name#");
Copy to Clipboard Toggle word wrap

您还可以在 managementNamePattern than the id 中使用不同的名称,例如,我们可以进行:

<camelContext id="myCamel" managementNamePattern="coolCamel">
Copy to Clipboard Toggle word wrap

如果您不希望将 OSGi 捆绑包 ID 作为 MBean 名称的一部分,您可能希望在 OSGi 环境中执行此操作。由于 OSGi 捆绑包 id 在您重新启动服务器时可能会改变,或者卸载并安装相同的应用程序。然后,您可以按以下方式使用 OSGi 捆绑包 id 作为名称的一部分:

<camelContext id="myCamel" managementNamePattern="#name#">
Copy to Clipboard Toggle word wrap

请注意,这需要 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> 上设置 loadStatisticsEnabled=false 来显式 禁用负载性能统计信息。请注意,如果静态级别也被配置为 off,它将会被关闭。默认情况下,在 Camel 2.13 开始,负载性能统计被禁用。您可以通过在 < jmxAgent> 中设置 loadStatisticsEnabled=true 来启用它

在运行时,您始终可以使用管理控制台(如 JConsole)更改给定路由或处理器上是否启用其统计信息。

注意

启用统计数据的含义是什么?

启用统计数据意味着 Camel 针对特定 MBean 执行精细的性能统计信息。您可以看到的统计数据有很多,例如:已完成的交换数/失败数、last/total/mina/max/mean 处理时间、第一次/最后失败时间等。

使用 Java DSL,您可以通过以下方法设置这个级别:

// only enable routes when Camel starts
context.getManagementStrategy().setStatisticsLevel(ManagementStatisticsLevel.RoutesOnly);
Copy to Clipboard Toggle word wrap

在 Spring DSL 中:

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
    <jmxAgent id="agent" statisticsLevel="RoutesOnly"/>
 ...
</camelContext>
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat