39.2. 实施组件接口
DefaultComponent 类 复制链接链接已复制到粘贴板!
					您可以通过扩展 org.apache.camel.impl.DefaultComponent 类来实施新组件,它为某些方法提供了一些标准功能和默认实施。特别是,DefaultComponent 类提供对 URI 解析和创建调度 执行器(用于调度的 轮询模式)的支持。
				
URI 解析 复制链接链接已复制到粘贴板!
					 base 组件接口中定义的 createEndpoint (String uri) 方法取完整的未解析端点 URI 作为其唯一参数。另一方面,DefaultComponent 类定义了具有以下签名的 createEndpoint () 方法的三参数版本:
				
					URI 是原始的、未解析的 URI; 剩余的 URI 在开始操作后一直从组件前缀中剥离,并在结尾剪切查询选项; 参数 包含解析的查询选项。这是 这是从 DefaultComponent 继承时必须覆盖的 createEndpoint () 方法的版本。这样做的好处是已为您解析端点 URI。
				
					以下文件组件的端点 URI 示例显示 URI 解析在实践中如何工作: 
				
file:///tmp/messages/foo?delete=true&moveNamePostfix=.old
file:///tmp/messages/foo?delete=true&moveNamePostfix=.old
					对于这个 URI,以下参数会传递到 createEndpoint () 的三参数版本:
				
| 参数 | 示例值 | 
|---|---|
|   
									  | |
|   
									  |   
									  | 
|   
									  |   
									在  
  | 
参数注入 复制链接链接已复制到粘贴板!
					 默认情况下,从 URI 查询选项中提取的参数会在端点的 bean 属性上注入。DefaultComponent 类会自动为您注入参数。
				
					例如,如果要定义支持两个 URI 查询选项的自定义端点: 删除和 moveNamePostfix。所有工作都必须在端点类中定义对应的 bean 方法(getters 和 setters):
				
也可以将 URI 查询选项注入到 消费者 参数中。详情请查看 “consumer 参数注入”一节。
禁用端点参数注入 复制链接链接已复制到粘贴板!
					 如果您的 Endpoint 类中没有定义参数,您可以通过禁用端点参数注入来优化端点创建过程。要在端点上禁用参数注入,请覆盖 useIntrospectionOnEndpoint () 方法并返回 false,如下所示:
				
protected boolean useIntrospectionOnEndpoint() {
  return false;
}
protected boolean useIntrospectionOnEndpoint() {
  return false;
}
						useIntrospectionOnEndpoint () 方法 不会影响在 Consumer 类上执行的参数注入。该级别上的参数注入由 Endpoint.configureProperties () 方法控制。(请参阅 第 40.2 节 “实施端点接口”)。
					
调度的 executor 服务 复制链接链接已复制到粘贴板!
调度的 executor 在调度轮询模式中使用,它负责推动消费者端点的定期轮询(调度的执行器实际上是一个线程池的实施)。
					要实例化调度的 executor 服务,请使用 CamelContext.getExecutorServiceStrategy () 方法返回的 ExecutorServiceStrategy 对象。有关 Apache Camel 线程模型的详情,请参考 第 2.8 节 “线程模型”。
				
						在 Apache Camel 2.3 之前,DefaultComponent 类提供了一个 getExecutorService () 方法来创建线程池实例。但是,自 2.3 起,创建线程池现在由 ExecutorServiceStrategy 对象集中管理。
					
验证 URI 复制链接链接已复制到粘贴板!
					如果要在创建端点实例前验证 URI,您可以覆盖 DefaultComponent 类中的 validateURI () 方法,该类具有以下签名:
				
protected void validateURI(String uri,
                           String path,
                           Map parameters)
   throws ResolveEndpointFailedException;
protected void validateURI(String uri,
                           String path,
                           Map parameters)
   throws ResolveEndpointFailedException;
					如果提供的 URI 没有所需的格式,则 validateURI () 的实现应抛出 org.apache.camel.ResolveEndpointFailedException 异常。
				
创建端点 复制链接链接已复制到粘贴板!
					例 39.2 “创建Endpoint ()的实现” 概述了如何实施 DefaultComponent.createEndpoint () 方法,它负责根据需要创建端点实例。
				
例 39.2. 创建Endpoint ()的实现
Example 复制链接链接已复制到粘贴板!
					例 39.3 “FileComponent 实施” 显示 FileComponent 类的示例实现。
				
例 39.3. FileComponent 实施
SynchronizationRouteAware Interface 复制链接链接已复制到粘贴板!
					借助 SynchronizationRouteAware 接口,您可以在交换被路由前和之后有回调。
				
- 
							
onBeforeRoute:在交换被给定路由路由之前被调用。但是,如果在启动路由后将SynchronizationRouteAware实施添加到UnitOfWork,则这个回调可能无法被调用。 onAfterRoute:在给定路由路由交换后调用。但是,如果交换通过多个路由路由,则会为每个路由生成调用后端。这个调用会在这些回调前发生:
- 
									路由使用者会将任何回复写入调用者(如果在非 
超出模式中) - 
									unit 
OfWork通过调用Synchronization.onComplete (org.apache.camel.Exchange)或Synchronization.onFailure (org.apache.camel.Exchange) 
- 
									路由使用者会将任何回复写入调用者(如果在非