Camel应用的管理与监控
1. 日志组件与ExchangeId记录
可以通过以下选项让日志组件记录ExchangeId:
showExchangeId=true
。使用Log EIP时,可使用简单表达式语言中的
${id}
来获取ID。
2. Tracer的使用
Tracer用于跟踪消息在Camel中的路由方式和时间。它通过拦截路由过程中从一个节点传递到另一个节点的每条消息来实现这一点。Camel在路由中的每个节点之间有一个Channel,Tracer作为拦截器受Channel控制,在运行时由Channel调用。
2.1 启用Tracer
-
Java DSL
:在
RouteBuilder类中调用context.setTracing(true)来启用,示例代码如下:
public void configure() throws Exception {
context.setTracing(true);
...
}
-
Spring XML
:在
<camelContext>中启用,示例如下:
<camelContext id="camel" trace="true"
xmlns="http://camel.apache.org/schema/spring">
2.2 Tracer输出示例
2010-01-10 16:40:58,229 [: FileComponent] INFO Tracer
- ca18a05b-a7a6-401b-8f83-e97ba35df87e >>> (route1)
from(file://target/rider/orders) --> wireTap(seda://audit) <<<
Pattern:InOnly, BodyType:org.apache.camel.component.file.GenericFile,
Body:123,4444,20100110,222,1
Tracer输出的日志以交换ID开头,可用于关联消息。日志还会输出消息当前所在的路由、
from --> to
节点、消息交换模式(InOnly或InOut)以及消息的相关信息。
流程图如下:
graph LR
A[消息起点] --> B{Tracer拦截}
B --> C[记录日志]
C --> D[消息传递到下一个节点]
2.3 定制Tracer
可以通过在注册表中定义一个ID为
traceFormatter
的bean来定制Tracer,使其输出不那么冗长。在Spring XML中可按如下方式操作:
<bean id="traceFormatter"
class="org.apache.camel.processor.interceptor.DefaultTraceFormatter">
<property name="showProperties" value="false"/>
<property name="showHeaders" value="false"/>
</bean>
traceFormatter
还有其他选项,如
maxChars
可限制日志记录的消息体长度。
2.4 为特定路由启用或禁用Tracer
-
Spring XML
:可在
<route>标签中启用或禁用Tracer,示例如下:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route trace="true">
<from uri="file://rider/orders"/>
<wireTap uri="seda:audit"/>
<bean beanType="camelinaction.OrderCsvToXmlBean"/>
<to uri="jms:queue:orders"/>
</route>
<route>
<from uri="seda:audit"/>
<bean beanType="camelinaction.AuditService"/>
</route>
</camelContext>
-
Java DSL
:使用
routing()或noTracing()方法,示例如下:
public void configure() throws Exception {
from("file://target/rider/orders")
.tracing()
.wireTap("seda:audit")
.bean(OrderCsvToXmlBean.class)
.to("jms:queue:orders");
from("seda:audit")
.bean(AuditService.class, "auditFile");
}
2.5 使用JMX管理Tracer
可以在JMX控制台的两个位置管理Tracer:上下文或路由。例如,要全局启用跟踪,可在CamelContext MBean中将
tracing
属性更改为
true
;也可在每个路由的基础上使用Routes MBeans进行操作。
操作步骤如下:
1. 在
chapter12/tracer
目录中运行
mvn compile exec:java -PManageTracer
启动应用程序。
2. 启动
jconsole
并连接到应用程序。
3. 点击
MBeans
选项卡,展开
org.apache.camel
节点。
4. 点击
Tracing
属性的值进行编辑,将其从
false
更改为
true
,然后按
Enter
确认。
3. 通知机制的使用
Camel的管理模块提供了通知器(notifiers)用于处理内部通知。这些通知在Camel内部发生特定事件时生成,如实例启动或停止、捕获到异常、消息创建或完成等。通知器作为监听器订阅这些事件,并在收到事件时做出反应。
3.1 Camel提供的内置通知器
| 通知器名称 | 描述 |
|---|---|
| LoggingEventNotifier | 使用Apache Commons Logging框架记录事件的文本表示,可使用log4j将日志消息发送到远程服务器 |
| PublishEventNotifier | 将事件分发到任何Camel端点,可利用Camel传输机制以任意方式广播消息 |
| JmxNotificationEventNotifier | 将事件作为JMX通知进行广播,管理和监控工具可订阅这些通知 |
3.2 配置事件通知器
- Java DSL :示例代码如下:
LoggingEventNotifier notifier = new LoggingEventNotifier();
notifier.setLogName("rider.EventLog");
notifier.setIgnoreCamelContextEvents(true);
notifier.setIgnoreRouteEvents(true);
notifier.setIgnoreServiceEvents(true);
context.getManagementStrategy().setEventNotifier(notifier);
- Spring XML :示例如下:
<bean id="eventLogger"
class="org.apache.camel.management.LoggingEventNotifier">
<property name="logName" value="rider.EventLog"/>
<property name="ignoreCamelContextEvents" value="true"/>
<property name="ignoreRouteEvents" value="true"/>
<property name="ignoreServiceEvents" value="true"/>
</bean>
3.3 使用自定义事件通知器
以Rider Auto Parts为例,他们想将现有的Camel应用与公司的集中式错误日志数据库集成,决定实现一个自定义事件通知器
RiderEventNotifier
,示例代码如下:
public class RiderEventNotifier extends EventNotifierSupport {
private RiderFailurePublisher publisher;
public void notify(EventObject eventObject) throws Exception {
if (eventObject instanceof ExchangeFailedEvent)
notifyFailure((ExchangeFailedEvent) eventObject);
}
}
protected void notifyFailure(ExchangeFailedEvent event) {
String id = event.getExchange().getExchangeId();
Exception cause = event.getExchange().getException();
Date now = new Date();
publisher.publish(appId, id, now,
cause.getMessage());
}
public boolean isEnabled(EventObject eventObject) {
return true;
}
protected void doStart() throws Exception {}
protected void doStop() throws Exception {}
}
可以在
chapter12/notifier
目录中使用
mvn test -Dtest=RiderEventNotifierTest
来测试这个示例。
流程图如下:
graph LR
A[事件发生] --> B{通知器拦截}
B --> C[过滤事件]
C --> D{是否为关注事件}
D -- 是 --> E[处理事件]
D -- 否 --> F[忽略事件]
Camel应用的管理与监控
4. Camel应用生命周期管理
4.1 管理路由
管理Camel应用的生命周期十分重要,可通过JMX可靠地停止、启动Camel,还能临时暂停或停止Camel路由,避免在处理事件时接收新消息。
操作步骤如下:
1. 使用JMX连接到应用程序。
2. 在JConsole中选择要管理的路由,可查看其属性,如已完成和失败的交换数量、性能等,
State
属性显示生命周期信息(启动或停止)。
3. 要停止路由,选择
Operations
条目,点击
stop
操作。
4. 返回
Attributes
条目,点击
Refresh
按钮更新属性,
State
属性值应变为
Stopped
。
4.2 管理消费者
Camel允许在运行时管理消费者并调整其行为。例如,若路由使用文件消费者拾取新文件,可更改其轮询间隔。
操作步骤如下:
1. 在MBean树中选择
consumers
下的文件消费者。
2. 点击
Delay
属性进行编辑。
3. 更改属性后,需重启消费者,先调用
stop
操作,再调用
start
操作。
5. 管理自定义Camel组件
假设Rider Auto Parts开发了一个Camel ERP组件,希望对其进行管理,该组件有一个详细模式开关,可用于在出现问题时从日志中获取更多信息。
5.1 实现管理功能
可在
ERPEndpoint
类中实现管理功能,示例代码如下:
import org.apache.camel.spi.ManagementAware;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedResource;
@ManagedResource(description = "Managed ERPEndpoint")
public class ERPEndpoint extends DefaultEndpoint
implements ManagementAware<ERPEndpoint> {
private boolean verbose;
public ERPEndpoint(String endpointUri, Component component) {
super(endpointUri, component);
}
@ManagedAttribute
public boolean isVerbose() {
return verbose;
}
@ManagedAttribute
public void setVerbose(boolean verbose) {
this.verbose = verbose;
}
public Object getManagedObject(ERPEndpoint object) {
return this;
}
}
实现步骤如下:
1. 使用
@ManagedResource
注解将类暴露为MBean。
2. 使用
@ManagedAttribute
注解将
verbose
属性暴露为可管理的属性。
3. 实现
ManagementAware
接口,在
getManagedObject
方法中返回
this
,告诉Camel使用该MBean进行管理。
5.2 测试示例
可在
chapter12/custom
目录中运行
mvn compile exec:java -Pcustom
来测试示例,路由如下:
from("timer:foo?period=5000")
.setBody().simple("Hello ERP calling at ${date:now:HH:mm:ss}")
.to("erp:foo")
.to("log:reply");
若要启用详细模式,可按以下步骤操作:
1. 启动JConsole并连接到应用程序。
2. 点击
MBeans
选项卡,找到自定义组件
erp://foo
。
3. 更改
Verbose
属性值为
true
,控制台应立即反映此更改。
6. 总结
通过上述介绍,我们了解了Camel应用管理与监控的多种方法,包括使用日志组件记录ExchangeId、利用Tracer跟踪消息路由、使用通知机制处理内部事件、管理Camel应用的生命周期以及管理自定义Camel组件。这些方法为我们提供了全面的工具,帮助我们更好地管理和监控Camel应用,确保其稳定运行。
以下是一个简单的总结表格:
| 管理与监控方法 | 描述 |
| ---- | ---- |
| 日志组件与ExchangeId记录 | 通过特定选项记录ExchangeId,使用简单表达式语言获取ID |
| Tracer的使用 | 跟踪消息路由,可在Java DSL和Spring XML中启用,可定制输出,可使用JMX管理 |
| 通知机制的使用 | 处理内部通知,Camel提供多种内置通知器,可自定义通知器 |
| Camel应用生命周期管理 | 可通过JMX管理路由和消费者的生命周期 |
| 管理自定义Camel组件 | 利用Spring JMX注解将自定义组件暴露为MBean进行管理 |
mermaid流程图展示Camel应用管理与监控的整体流程:
graph LR
A[日志组件与ExchangeId记录] --> B[Tracer的使用]
B --> C[通知机制的使用]
C --> D[Camel应用生命周期管理]
D --> E[管理自定义Camel组件]
超级会员免费看
21

被折叠的 条评论
为什么被折叠?



