【发布时间】:2015-07-08 18:48:58
【问题描述】:
很多时候,我想将消息发送到另一个路由来处理它,但我不希望为后续步骤修改消息。最好的方法是什么?
例如,我想使用 sendMail 路由发送一封电子邮件,为了安全起见,它会去除额外的标头,但我需要保留主路由的其余部分的标头。
我目前想出的最佳方法是使用带有虚假第二路由的多播(因为默认聚合策略是 UseLatestAggregationStrategy):
<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>
...但这有点丑陋,并不真正符合“多播”的精神。
我发现的另一个选项是使用异步 seda 端点,它将原始消息返回给生产者并处理副本,但这会引入可能并不总是理想的异步行为。
看来一定有更好的办法?
【问题讨论】:
-
将剥离的部分存储在发送邮件的标头中,然后重新组合邮件?
-
如何将content enricher 与自定义聚合策略一起使用,丢弃丰富响应并返回原始交换?
-
@Namphibian:任何额外的标题都将包含在电子邮件中,这在此处是不可接受的
-
@Ralf:嗯,我认为它会,但为了丰富你必须将发送邮件管道放在它自己的路由中并注册一个策略 bean
-
是的,我考虑过引入一个堆栈,这样你就可以推送/弹出消息,然后你可以推送/做东西/弹出,然后你又回到了给定的消息时间。虽然它可以是保存点而不是堆栈,并且具有名称/ID,保存(a)/做东西/恢复(a)
标签: apache-camel