2.14. OnCompletion
概述 复制链接链接已复制到粘贴板!
					OnCompletion DSL 名称用于定义在完成 工作单元时要执行的操作。工作单元是 Camel 概念,包含整个交换。请参阅 第 34.1 节 “Exchanges”。onCompletion 命令具有以下特性:
				
- 
							
OnCompletion命令的范围可以是全局或每个路由。路由范围覆盖全局范围。 - 
							
OnCompletion可以配置为在成功失败时触发。 - 
							
onWhenpredicate 可用于在特定情况下触发Completion。 - 您可以定义是否有使用线程池,但默认设置不是线程池。
 
仅对Completion 的路由范围 复制链接链接已复制到粘贴板!
					在交换上指定了 onCompletion DSL 时,Camel 会从新线程关闭。这允许原始线程 在Completion 任务中的任何干扰的情况下继续。路由只支持 Completion。在以下示例中,触发了 Completion,即交换是否成功完成还是失败。这是默认的操作。
				
对于 XML 格式,格式如下:
					要在失败时触发 Completion,可以使用 onFailureOnly 参数。同样,若要在 success 上触发Completion,请使用 CompleteOnly 参数。
				
					对于 XML,inFailureOnly 和 onCompleteOnly 在 Completion 标签中以布尔值形式表示:
				
在完成过程中进行全局范围 复制链接链接已复制到粘贴板!
					为多个路由定义 Completion :
				
使用 onWhen 复制链接链接已复制到粘贴板!
					要在某些情况下触发 Completion,请使用 onWhen predicate。当消息正文包含文字 Hello: 
				
使用带有或没有线程池的 onletion 复制链接链接已复制到粘贴板!
					自 Camel 2.14 起,默认情况下,Completion 不使用线程池。要强制使用线程池,可以设置 executorService 或将 parallelProcessing 设置为 true。例如,在 Java DSL 中,使用以下格式:
				
onCompletion().parallelProcessing()
     .to("mock:before")
     .delay(1000)
     .setBody(simple("OnComplete:${body}"));
onCompletion().parallelProcessing()
     .to("mock:before")
     .delay(1000)
     .setBody(simple("OnComplete:${body}"));
对于 XML,格式为:
<onCompletion parallelProcessing="true">
   <to uri="before"/>
   <delay><constant>1000</constant></delay>
   <setBody><simple>OnComplete:${body}<simple></setBody>
 </onCompletion>
<onCompletion parallelProcessing="true">
   <to uri="before"/>
   <delay><constant>1000</constant></delay>
   <setBody><simple>OnComplete:${body}<simple></setBody>
 </onCompletion>
					使用 executorServiceRef 选项引用特定的线程池:
				
<onCompletion executorServiceRef="myThreadPool"
   <to uri="before"/>
   <delay><constant>1000</constant></delay>
   <setBody><simple>OnComplete:${body}</simple></setBody>
 </onCompletion>>
<onCompletion executorServiceRef="myThreadPool"
   <to uri="before"/>
   <delay><constant>1000</constant></delay>
   <setBody><simple>OnComplete:${body}</simple></setBody>
 </onCompletion>>
在消费者发送响应前运行Completion 复制链接链接已复制到粘贴板!
					在Completion 可以在两种模式下运行:
				
- AfterConsumer - 在消费者完成后运行的默认模式
 - 
							BeforeConsumer - 在消费者向调用者写入响应之前运行。这允许 
Completion修改 Exchange,如添加特殊标头,或者将 Exchange 配置为响应日志记录器。 
					例如,要在响应中添加 由标头创建的,请使用 modeBeforeConsumer (),如下所示:
				
.onCompletion().modeBeforeConsumer()
     .setHeader("createdBy", constant("Someone"))
 .end()
.onCompletion().modeBeforeConsumer()
     .setHeader("createdBy", constant("Someone"))
 .end()
					对于 XML,将 mode 属性设置为 BeforeConsumer :
				
<onCompletion mode="BeforeConsumer">
   <setHeader headerName="createdBy">
     <constant>Someone</constant>
   </setHeader>
 </onCompletion>
<onCompletion mode="BeforeConsumer">
   <setHeader headerName="createdBy">
     <constant>Someone</constant>
   </setHeader>
 </onCompletion>