Apache camel 驼峰:处理邮件副本/保存原始邮件

Apache camel 驼峰:处理邮件副本/保存原始邮件,apache-camel,Apache Camel,通常情况下,我希望将消息发送到另一个路由来处理它,但我不希望在后续步骤中修改消息。最好的方法是什么 例如,我想使用sendMail路由发送电子邮件,为了安全起见,这会去掉额外的头,但我需要保留主路由其余部分的头 目前我想到的最好的方法是使用带有虚假第二条路由的多播(因为默认聚合策略是UselateStaggegationStrategy): noop路由,以便多播返回原始消息 ${body} 。。。但这有点难看,并不真正符合“多播”的精神 我发现的另一种选择是使用异步seda端点,它将原始消

通常情况下,我希望将消息发送到另一个路由来处理它,但我不希望在后续步骤中修改消息。最好的方法是什么

例如,我想使用sendMail路由发送电子邮件,为了安全起见,这会去掉额外的头,但我需要保留主路由其余部分的头

目前我想到的最好的方法是使用带有虚假第二条路由的多播(因为默认聚合策略是UselateStaggegationStrategy):


noop路由,以便多播返回原始消息
${body}
。。。但这有点难看,并不真正符合“多播”的精神

我发现的另一种选择是使用异步seda端点,它将原始消息返回给生产者并处理副本,但这会引入异步行为,这可能并不总是可取的

看来一定有更好的办法吗?

你可以查一下


基本上,您可以使用
exchange.getUnitOfWork().getOriginalInMessage()
要获取原始邮件

将剥离的部分存储在邮件头中,执行sendmail,然后重新组装邮件?使用自定义聚合策略,放弃充实响应并返回原始exchange,怎么样?@Namphibian:任何额外的邮件头都将包含在电子邮件中,这是不可接受的here@Ralf:嗯,我想会的,不过对于enrich,你必须将发送邮件管道放在它自己的路径上,并注册一个策略beanYeah我考虑过引入一个堆栈,这样你就可以推送/弹出消息,然后你就可以推/做东西/弹出,你就回到了给定时间的信息。虽然它可以是savepoint并具有名称/id,而不是stack,但是save(a)/do stuff/restore(a)
<from uri="direct:sendEmail"/>
<multicast>
  <pipeline>
    <removeHeaders pattern="*" excludePattern="(?i)to|cc|bcc|from|subject"/>
    <to ref="mailServer"/>
  </pipeline>

  <transform>
    <description>noop route so that multicast returns original message</description>
    <simple>${body}</simple>
  </transform>
</multicast>