|
该版本仍在开发中,尚未被视为稳定。对于最新的稳定版本,请使用 Spring Integration 7.0.0! |
消息处理链
这消息处理链是 的实现消息处理器它可以配置为单一消息端点,同时实际上委派给一系列其他处理程序,如Filter、变换器、分线器等。
当多个处理程序需要以固定的线性进程连接时,这会导致配置更加简单。
例如,通常在其他元件之前先提供转换器。
同样,当你在链中的其他组件之前提供过滤器时,实际上就是创造了一个选择性消费者。
无论哪种情况,链条只需一个输入通道以及一首单曲输出通道,消除了为每个组件定义通道的需求。
这消息处理链主要为XML配置设计。
对于Java DSL,一个集成流程定义可以被视为链式组件,但它与本章所述的概念和原则无关。
更多信息请参见Java DSL。 |
春季集成Filter提供一个布尔属性:throwExceptionOnRejection.
当你在同一点对点信道上为多个选择性消费者提供不同的接受标准时,应将该值设置为“true”(默认为false这样调度员就知道消息被拒绝了,因此会尝试将消息传递给其他订阅者。
如果没有抛出异常,调度器会认为消息已成功传递,尽管过滤器已丢弃该消息以防止进一步处理。
如果你确实想“丢弃”消息,过滤器的“丢弃通道”可能有用,因为它给你机会对丢弃消息执行某些作(比如发送到JMS队列或写入日志)。 |
处理链简化了配置,同时内部保持组件间的松耦合程度,如果需要非线性排列,修改配置也变得简单。
内部链被扩展为列出的端点线性排列,中间由匿名通道分隔。
响应信道头部在链中不被考虑。
只有在最后一个处理器被调用后,生成的消息才会被转发到回复信道或链的输出信道。
由于这种设置,除最后一个处理程序外,所有处理程序都必须实现消息制作人接口(提供一种“setOutputChannel()”方法)。
如果输出通道在消息处理链是设置的,最后一个处理器只需要一个输出通道。
与其他端点一样,输出通道是可选的。
如果链条末端有回复消息,输出通道优先。
然而,如果无法使用该信道头,链处理程序会检查入站消息的回复信道头作为备援。 |
在大多数情况下,你不必实现消息处理器你自己。
下一节重点介绍链元素的命名空间支持。
大多数 Spring Integration 端点,如服务激活器和变换器,都适合在消息处理链.
链的配置
这<链>元素提供输入通道属性。
如果链中的最后一个元素能够生成回复消息(可选),它也支持输出通道属性。
子元件包括Filter、转换器、分配器和服务激活器。
最后一个元件也可以是路由器或出站通道适配器。
以下示例展示了链式定义:
<int:chain input-channel="input" output-channel="output">
<int:filter ref="someSelector" throw-exception-on-rejection="true"/>
<int:header-enricher>
<int:header name="thing1" value="thing2"/>
</int:header-enricher>
<int:service-activator ref="someService" method="someMethod"/>
</int:chain>
这<header-enricher>前述示例中使用的元素设置一个名为东西1其值为东西2在留言中。
头部增益器是 的一种专门化转换器只涉及头部值。
你可以通过实现消息处理器它做了排气头的修改和接线,但加热喷头增强器是更简单的选择。
这<链>可以配置为消息流的最后一个“封闭盒”用户。
对于这个解决方案,你可以把它放在<链末端>某个<出站通道适配器>,如下示例所示:
<int:chain input-channel="input">
<int-xml:marshalling-transformer marshaller="marshaller" result-type="StringResult" />
<int:service-activator ref="someService" method="someMethod"/>
<int:header-enricher>
<int:header name="thing1" value="thing2"/>
</int:header-enricher>
<int:logging-channel-adapter level="INFO" log-full-message="true"/>
</int:chain>
|
禁止的属性和元素
某些属性,例如 对于 Spring Integration 的核心组件,XML 模式本身就强制执行了这些约束。 然而,对于非核心组件或你自己的自定义组件,这些约束是由XML命名空间解析器强制执行,而非XML模式。 这些XML命名空间解析器约束是在Spring Integration 2.2中添加的。
如果你尝试使用不允许的属性和元素,XML 命名空间解析器会抛出 |
使用 'id' 属性
从 Spring Integration 3.0 开始,如果给定链元素身份证属性,元素的豆名是链条的组合身份证以及身份证元素本身。
元素身份证属性不被注册为豆子,但每个属性都被赋予组件名称这包括链条身份证.
请考虑以下例子:
<int:chain id="somethingChain" input-channel="input">
<int:service-activator id="somethingService" ref="someService" method="someMethod"/>
<int:object-to-json-transformer/>
</int:chain>
在前面的例子中:
-
这
<链>根元素具有身份证“某物链”的。 因此,摘要终点实现(民调消费者或EventDrivenConsumer,根据输入通道类型)豆子将此值作为豆子名称。 -
这
消息处理链豆子获得了豆子别名(“somethingChain.handler”),允许从豆子工厂. -
这
<服务激活器>它不是一个完整的消息终端(它不是民调消费者或EventDrivenConsumer). 它是消息处理器在<链>. 在这种情况下,注册在豆子工厂是“某某Chain$child.somethingService.handler”。 -
这
组件名称这件事服务激活处理器取值相同,但不带“.handler”后缀。 它变成了“somethingChain$child.somethingService”。 -
最后
<链>子组件,<object-to-json-transformer>,没有身份证属性。 其组件名称基于其在<链>. 在这种情况下,是“somethingChain$child#1”。 (名称的最后一个元素是链条中的顺序,以“#0”开头)。 注意,该变换器在应用上下文中未被注册为豆子,因此不会获得豆名. 然而,它组件名称具有对日志记录及其他用途有用的值。
提供明确的身份证属性<链>元素简化日志中子组件的识别,并提供从豆子工厂等。 |
从链中调用链
有时,你需要在链中对另一条链进行嵌套调用,然后返回继续在原链内执行。 为此,你可以通过包含<gateway>元素来使用消息网关,如下示例所示:
<int:chain id="main-chain" input-channel="in" output-channel="out">
<int:header-enricher>
<int:header name="name" value="Many" />
</int:header-enricher>
<int:service-activator>
<bean class="org.foo.SampleService" />
</int:service-activator>
<int:gateway request-channel="inputA"/>
</int:chain>
<int:chain id="nested-chain-a" input-channel="inputA">
<int:header-enricher>
<int:header name="name" value="Moe" />
</int:header-enricher>
<int:gateway request-channel="inputB"/>
<int:service-activator>
<bean class="org.foo.SampleService" />
</int:service-activator>
</int:chain>
<int:chain id="nested-chain-b" input-channel="inputB">
<int:header-enricher>
<int:header name="name" value="Jack" />
</int:header-enricher>
<int:service-activator>
<bean class="org.foo.SampleService" />
</int:service-activator>
</int:chain>
在上述例子中,嵌套链-A在 的结尾称为主链由配置好的“网关”元素进行处理。
在嵌套链-A,呼唤嵌套链-b是在header enrichment之后完成的。
然后流程回来完成执行嵌套链-b.
最后,流程回到主链.
当 a 的嵌套版本时<网关>元素在链中定义,不需要服务接口属性。
相反,它会将消息当前状态放入定义的信道上请求信道属性。
当该网关发起的下游流完成时,a消息被送回传送门,继续在当前链条中的旅程。