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 确实非常困难、不错,你就没错了。Eucky for us Spring though 还创建了一系列注释,您可以使用它们在现有 Bean 上导出管理。这意味着,您通常使用它,且只从 ManagementAware 接口在 getManagedObject 中返回它。例如,请参阅上面的带有 CustomEndpoint 的代码示例。

现在,在 Camel 2.1 中,您可以为 Camel 注册管理的所有对象执行此操作,而这是个生动,但不是全部。

对于没有实现此 ManagementAware 接口的服务,Camel 将使用下表中定义的默认打包程序:

Expand
类型MBean wrapper

CamelContext

ManagedCamelContext

组件

ManagedComponent

端点

ManagedEndpoint

消费者

ManagedConsumer

制作者

ManagedProducer

Route

ManagedRoute

处理器

ManagedProcessor

tracer

ManagedTracer

Service

ManagedService

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

Expand
类型MBean wrapper

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相同
  • 计数器 - 递增计数器 * bundleId - OSGi 捆绑包 id (仅适用于 OSGi 环境)
  • symbolicName - OSGi 符号链接名称(仅适用于 OSGi 环境)
  • 版本 - OSGi 捆绑包版本(仅适用于 OSGi 环境)

默认命名模式在 OSGi 和非OSGi 之间区分,如下所示:

  • 非 OSGI: 名称
  • OSGi: bundleId-name
  • OSGi Camel 2.13: symbolicName

但是,如果 JMXMBeanServer 中存在命名 clash,则 Camel 将自动回退,并在模式中使用 计数器 进行补救。因此,将使用以下模式:

  • 非 OSGI: 名称计数器
  • 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

您还可以在与 id 不同的 managementNamePattern 中使用名称,例如,我们可以这样做:

<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 现在提供了一个完全可插拔的管理策略,允许您控制管理。这是一个丰富的界面,具有多种用于管理方法。不仅用于从 MBeanServer 添加和删除受管对象,也提供了事件通知,也使用 org.apache.camel.spi.EventNotifier API。例如,它允许更轻松地为其他管理产品提供适配器。此外,它还允许您提供 Apache 中开箱即用的更多详细信息和功能。

180.6.6. 为性能统计配置粒度级别

从 Camel 2.1 开始提供

现在,您可以设置一个预设置级别,无论是启用性能统计数据,还是在 Camel 启动时启用。级别是

  • 作为默认 扩展,但运行时会收集其他统计信息,如对端点的细粒度使用情况等。这个选项需要 Camel 2.16
  • 所有 / Default - Camel 将为路由和处理器(细粒度)启用统计信息。在 All 选项后的 Camel 2.16 中被重命名为 Default。
  • RoutesOnly - Camel 将仅为路由启用统计信息(粗粒度)
  • off - Camel 不会为任何启用统计信息。

Camel 2.9 开始,性能统计还包括每个 CamelContext 和 Route MBeans 的平均负载统计。统计数据是基于动态交换数量的平均负载,每 1、5 和 15 分钟率。这和 Unix 系统上的负载统计信息类似。Camel 2.11 以后允许您通过在 < jmxAgent> 中设置 loadStatisticsEnabled=false 来显式 禁用负载性能统计信息。请注意,如果静态级别被配置为 off,它将处于 off 状态。从 Camel 2.13 开始的负载性能统计会被默认禁用。您可以通过在 < jmxAgent> 中设置 loadStatisticsEnabled=true 来启用它

在运行时,您可以始终使用管理控制台(如 JConsole)来更改给定路由或处理器,无论其统计数据是启用的。

注意

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

启用统计数据意味着 Camel 将为特定 MBean 进行精细的性能统计信息。您可以看到的统计数据有很多,例如: Exchanges completed/failed、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