180.4. 在 Camel 中激活 JMX
Spring JAR 依赖项,对于 Camel 2.8 或更早版本需要
Camel 的 classpath 需要 Spring -context.jar、spring-aop.jar、spring-beans.jar 和 spring-core.jar。如果这些 .jars 不在 classpath 中,Camel 将回退到非 JMX 模式。这种情况使用日志记录器名称 org.apache.camel.impl.DefaultCamelContext 记录到 WARN 级别。
从 Camel 2.9 开始,在 JMX 模式下运行 Camel 不再需要 Spring JAR。
180.4.1. 使用 JMX 管理 Apache Camel 复制链接链接已复制到粘贴板!
默认情况下,在 Camel 中启用 JMX 检测代理,这意味着 Camel 运行时在虚拟机中使用 MBeanServer 实例创建并注册 MBeanServer 实例。这允许 Camel 用户立即获取 Camel 路由如何执行单个处理器级别的见解。
支持的管理对象包括 端点、路由、服务,以及 处理器。除了性能计数器属性外,这些管理对象还公开生命周期操作。
DefaultManagementNamingStrategy 是默认的命名策略,它构建用于 MBean 注册的对象名称。默认情况下,org.apache.camel 是 CamelNamingStrategy 创建的所有对象名称的域名。MBean 对象的域名可由 Java VM 系统属性配置:
-Dorg.apache.camel.jmx.mbeanObjectDomainName=your.domain.name
-Dorg.apache.camel.jmx.mbeanObjectDomainName=your.domain.name
或者,通过在 Spring 配置中的 camelContext 元素中添加 jmxAgent 元素:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<jmxAgent id="agent" mbeanObjectDomainName="your.domain.name"/>
...
</camelContext>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<jmxAgent id="agent" mbeanObjectDomainName="your.domain.name"/>
...
</camelContext>
Spring 配置始终优先于系统属性。所有 JMX 相关配置都为 true。
180.4.2. 在 Camel 中禁用 JMX 检测代理 复制链接链接已复制到粘贴板!
您可以通过设置 Java VM 系统属性来禁用 JMX 检测代理,如下所示:
-Dorg.apache.camel.jmx.disabled=true
-Dorg.apache.camel.jmx.disabled=true
属性值被视为 布尔值。
或者,通过在 Spring 配置中的 camelContext 元素中添加 jmxAgent 元素:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<jmxAgent id="agent" disabled="true"/>
...
</camelContext>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<jmxAgent id="agent" disabled="true"/>
...
</camelContext>
或者,在 Camel 2.1 中,如果使用纯 Java,则不需要使用 JVM 系统属性,如下所示:
CamelContext camel = new DefaultCamelContext(); camel.disableJMX();
CamelContext camel = new DefaultCamelContext();
camel.disableJMX();
180.4.3. 在 Java 虚拟机中查找 MBeanServer 复制链接链接已复制到粘贴板!
每个 CamelContext 都可以在 InstrumentationLifecycleStrategy 中嵌套了一个 InstrumentationAgent 实例。InstrumentationAgent 是与 MBeanServer 接口接口的对象,用于注册 / unregister Camel MBeans。多个 CamelContexts / InstrumentationAgents 可以 / 应共享 MBeanServer。默认情况下,Camel 运行时会选择 MBeanServer Factory.findMBeanServer 方法返回的第一个 MBeanServer 方法,该方法与 org.apache.camel 的默认域名匹配。
您可能希望更改默认域名,使其与已在应用程序中使用的 MBeanServer 实例匹配。特别是,如果您的 MBeanServer 附加到 JMX 连接器服务器,则不需要在 Camel 中创建连接器服务器。
您可以通过系统属性配置匹配的默认域名。
-Dorg.apache.camel.jmx.mbeanServerDefaultDomain=<your.domain.name>
-Dorg.apache.camel.jmx.mbeanServerDefaultDomain=<your.domain.name>
或者,通过在 Spring 配置中的 camelContext 元素中添加 jmxAgent 元素:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<jmxAgent id="agent" mbeanServerDefaultDomain="your.domain.name"/>
...
</camelContext>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<jmxAgent id="agent" mbeanServerDefaultDomain="your.domain.name"/>
...
</camelContext>
如果没有找到匹配的 MBeanServer,则会创建一个新 MBeanServer,并根据上述默认设置和配置新的 'MBeanServer's 默认域名。
如果需要,可以通过设置系统属性来管理 JVM MBeans,则可以使用 PlatformMBeanServer。MBeanServer 默认域名配置会被忽略,因为它不适用。
从下一个版本(1.5)开始,usePlatformMBeanServer 的默认值将更改为 true。您可以使用平台 MBeanServer 将 属性设置为 false 以禁用。
-Dorg.apache.camel.jmx.usePlatformMBeanServer=True
-Dorg.apache.camel.jmx.usePlatformMBeanServer=True
或者,通过在 Spring 配置中的 camelContext 元素中添加 jmxAgent 元素:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<jmxAgent id="agent" usePlatformMBeanServer="true"/>
...
</camelContext>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<jmxAgent id="agent" usePlatformMBeanServer="true"/>
...
</camelContext>
180.4.4. Camel JMX 支持的系统属性 复制链接链接已复制到粘贴板!
| 属性名称 | value | 描述 |
|---|---|---|
|
|
|
如果为 |
请参阅以下部分中的更多系统属性: jmxAgent Properties Reference。
180.4.5. 如何使用 JMX 进行身份验证 复制链接链接已复制到粘贴板!
JDK 中的 JMX 具有身份验证的功能,也用于通过 SSL 使用安全连接。您必须参考 SUN 文档来使用它:
180.4.6. 应用程序服务器中的 JMX 复制链接链接已复制到粘贴板!
180.4.6.1. Tomcat 6 复制链接链接已复制到粘贴板!
有关在 Tomcat 中启用 JMX 的详情,请查看 此页面。
简而言之,修改您的 catalina.sh (或 Windows 中的 catalina.bat)文件来设置以下选项…
set CATALINA_OPTS=-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false
set CATALINA_OPTS=-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false
180.4.6.2. JBoss AS 4 复制链接链接已复制到粘贴板!
默认情况下,JBoss 创建自己的 MBeanServer。要允许 Camel 向同一服务器公开,请按照以下步骤执行:
-
告知 Camel 使用平台
MBeanServer(在 Camel 1.5 中默认为 true)
<camel:camelContext id="camelContext"> <camel:jmxAgent id="jmxAgent" mbeanObjectDomainName="org.yourname" usePlatformMBeanServer="true" /> </camel:camelContext>
<camel:camelContext id="camelContext">
<camel:jmxAgent id="jmxAgent" mbeanObjectDomainName="org.yourname" usePlatformMBeanServer="true" />
</camel:camelContext>
-
将您的 JBoss 实例更改为使用平台
MBeanServer。
通过编辑run.sh或run.conf-Djboss.platform.mbeanserver,将下列属性添加到JAVA_OPTS。See http://wiki.jboss.org/wiki/JBossMBeansInJConsole
180.4.6.3. WebSphere 复制链接链接已复制到粘贴板!
将 mbeanServerDefaultDomain 更改为 WebSphere :
<camel:jmxAgent id="agent" createConnector="true" mbeanObjectDomainName="org.yourname" usePlatformMBeanServer="false" mbeanServerDefaultDomain="WebSphere"/>
<camel:jmxAgent id="agent" createConnector="true" mbeanObjectDomainName="org.yourname" usePlatformMBeanServer="false" mbeanServerDefaultDomain="WebSphere"/>
180.4.6.4. Oracle OC4j 复制链接链接已复制到粘贴板!
Oracle OC4J J2EE 应用服务器不允许 Camel 访问平台 MBeanServer。您可以在日志中识别这一点,因为 Camel 将记录 WARNING。
xxx xx, xxxx xx:xx:xx xx org.apache.camel.management.InstrumentationLifecycleStrategy onContextStart
WARNING: Could not register CamelContext MBean
java.lang.SecurityException: Unauthorized access from application: xx to MBean: java.lang:type=ClassLoading
at oracle.oc4j.admin.jmx.shared.UserMBeanServer.checkRegisterAccess(UserMBeanServer.java:873)
xxx xx, xxxx xx:xx:xx xx org.apache.camel.management.InstrumentationLifecycleStrategy onContextStart
WARNING: Could not register CamelContext MBean
java.lang.SecurityException: Unauthorized access from application: xx to MBean: java.lang:type=ClassLoading
at oracle.oc4j.admin.jmx.shared.UserMBeanServer.checkRegisterAccess(UserMBeanServer.java:873)
要解决这个问题,您应该在 Camel 中禁用 JMX 代理,请参阅 在 Camel 中禁用 JMX 检测代理 部分。
180.4.7. 高级 JMX 配置 复制链接链接已复制到粘贴板!
Spring 配置文件允许您配置 Camel 如何公开给 JMX 进行管理。在某些情况下,您可以指定更多信息,如连接器的端口或路径名称。
180.4.8. 例如: 复制链接链接已复制到粘贴板!
如果要更改 Java 5 JMX 设置,您可以使用各种 JMX 系统属性
例如,您可以通过设置以下环境变量(根据您的平台使用 set 或 export ),启用到 Sun JMX 连接器的远程 JMX 连接。这些设置只在 Java 1.5+ 中配置 Sun JMX 连接器,而不是默认情况下 Camel 创建的 JMX 连接器。
SUNJMX=-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=1616 \ -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
SUNJMX=-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=1616 \
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
(SUNJMX 环境变量由 Camel 的启动脚本使用简单,作为 JVM 的额外启动参数。如果您直接启动 Camel,则必须自行传递这些参数。)
180.4.9. jmxAgent Properties Reference 复制链接链接已复制到粘贴板!
| Spring 属性 | 系统属性 | 默认值 | 描述 |
|---|---|---|---|
|
| JMX 代理名称,它不是可选 | ||
|
|
|
|
如果为 |
|
|
|
|
|
|
|
|
| 所有对象名称使用的 JMX 域 |
|
|
|
|
如果我们应该为 |
|
|
|
| JMX RMI registry 将使用的端口 |
|
|
| -1 (动态) | JMX RMI 服务器要使用的端口 |
|
|
|
| JMX 连接器将注册的路径 |
|
|
|
| Camel 2.0: 如果启用了这个选项,则只会注册带有自定义 id 集的处理器。这可让您在 JMX 控制台中提交不需要的处理器。 |
|
|
| Camel 2.1 : 配置是否为 MBean 启用性能统计的级别。如需了解更多详细信息,请参阅配置粒度级别以了解性能统计信息。从 Camel 2.16 开始,All 选项被重命名为 Default,并引入了一个新的 Extended 选项,允许收集额外的运行时 JMX 指标。 | |
|
|
|
Camel 2.13: 是否在 MBean 命名中包含主机名。从 Camel 2.13 开始,默认为 | |
|
|
|
| Camel 2.16 : 在创建远程连接器时,是否在服务 url 中使用主机名或 IP 地址。默认情况下将使用主机名。 |
|
|
|
| Camel 2.16:是否启用负载统计信息(使用每个 CamelContext 的后台线程收集收集统计信息)。 |
|
|
|
| Camel 2.16: 是否启用端点运行时统计信息(收集每个传入和传出端点的运行时使用情况)。 |
180.4.10. 配置是否总是注册 MBeans,用于新路由或默认仅注册 复制链接链接已复制到粘贴板!
从 Camel 2.7 开始提供
Camel 现在提供 2 个设置来控制是否注册 mbeans
| 选项 | 默认 | 描述 |
|---|---|---|
|
|
| 如果启用,则 MBeans 始终被注册。 |
|
|
| 如果启用,则在 CamelContext 启动后添加新路由也会从该给定路由注册 MBeans。 |
默认情况下,Camel 为启动时配置的所有路由注册 MBeans。registerNewRoutes 选项控制在之后添加新路由时也应注册 MBeans。例如,您可以在不需要管理时添加和删除临时路由,您可以禁用它。
在使用动态 EIP 模式时,请小心使用 registerAlways 选项,如 Recipient List 具有唯一端点。如果是这样,则每个唯一端点及其关联的 services/producer 也会被注册。这可能会导致因为 registry 中的 mbeans 数量增加而造成系统问题。MBean 不是轻量级对象,因此消耗内存。