在Spring Integration中,很少有人可以操纵消息。一种方法是在<int:enricher>
内调用bean的方法,该方法将返回一个对象并将其分配给给定的名称,例如:
<!-- calls getKey method of IdGenerator bean which returns String with some value -->
<int:enricher input-channel="a.channel" output-channel="b.channel" id="preTranslator">
<int:header name="Key" expression="@IdGenerator.getId(payload)"/>
</int:enricher>
可以在过滤中使用相同的内容:
int:filter discard-channel="d.channel" input-channel="b.channel" output-channel="c.channel"
expression="@Cache.hasKey(headers.Key) == false"/>
另一方面,我可以在实现<int:service-activator>
接口的类上调用MessageProcessor
。它将采用原始消息并返回带有新标头字段的副本。这需要我的类的方法总是使用MessageBuilder构建一个新消息。
目前,我使用第一种方式进行简单的字段丰富和服务激活,以便从DB /外部服务请求数据。选择正确方法的正确方法是什么?
答案 0 :(得分:0)
首先,<filter>
根本不会改变消息。 given name
应该被视为header
,看你的情况。
<service-activator>
始终返回新消息。是的,您也可以在那里填充新的headers
,您必须使用MessageBuilder
。
完全不清楚你的问题是什么。如果你可以在配置中使用表达式来实现解决方案,那就这样吧。但是,如果您对代码中的邮件执行某些操作并希望添加/编辑/删除headers
,则可以使用MessageBuilder
。
那真的很好。我认为您应该在应用程序中阅读更多文档和更多代码。
最终,您将找到最适合自己的风格。例如,我最终使用表达式和Groovy脚本。根本没有Java代码。但是现在我更喜欢Spring Integration Java DSL,因为它更快,更干净,更流畅,并且可以摆脱任何其他配置,如XML或Groovy。现在一切都是Java,MessageBuilder
仍在马上!