通道适配器
通道适配器(Channel Adapter)是一种消息端点,用于连接单个发送方或接收方到消息通道。Spring Integration 提供了许多适配器来支持各种传输,例如 JMS、文件、HTTP、Web 服务、邮件等等。本参考指南后续章节将讨论每个适配器。但是,本章重点介绍简单但灵活的方法调用通道适配器支持。存在入站和出站适配器,并且每个适配器都可以使用核心命名空间中提供的 XML 元素进行配置。只要您有一个可以作为源或目标调用的方法,这些元素就可以轻松地扩展 Spring Integration。
配置入站通道适配器
inbound-channel-adapter
元素(在 Java 配置中为 SourcePollingChannelAdapter
)可以在 Spring 托管对象上调用任何方法,并在将方法的输出转换为 Message
后,将非空返回值发送到 MessageChannel
。当适配器的订阅被激活时,轮询器会尝试从源接收消息。轮询器根据提供的配置由 TaskScheduler
进行调度。要为单个通道适配器配置轮询间隔或 cron 表达式,您可以提供一个包含一个调度属性(例如 'fixed-rate' 或 'cron')的 'poller' 元素。以下示例定义了两个 inbound-channel-adapter
实例
-
Java DSL
-
Java
-
Kotlin DSL
-
XML
@Bean
public IntegrationFlow source1() {
return IntegrationFlow.from(() -> new GenericMessage<>(...),
e -> e.poller(p -> p.fixedRate(5000)))
...
.get();
}
@Bean
public IntegrationFlow source2() {
return IntegrationFlow.from(() -> new GenericMessage<>(...),
e -> e.poller(p -> p.cron("30 * 9-17 * * MON-FRI")))
...
.get();
}
public class SourceService {
@InboundChannelAdapter(channel = "channel1", poller = @Poller(fixedRate = "5000"))
Object method1() {
...
}
@InboundChannelAdapter(channel = "channel2", poller = @Poller(cron = "30 * 9-17 * * MON-FRI"))
Object method2() {
...
}
}
@Bean
fun messageSourceFlow() =
integrationFlow( { GenericMessage<>(...) },
{ poller { it.fixedRate(5000) } }) {
...
}
<int:inbound-channel-adapter ref="source1" method="method1" channel="channel1">
<int:poller fixed-rate="5000"/>
</int:inbound-channel-adapter>
<int:inbound-channel-adapter ref="source2" method="method2" channel="channel2">
<int:poller cron="30 * 9-17 * * MON-FRI"/>
</int:channel-adapter>
另请参阅 通道适配器表达式和脚本。
如果未提供轮询器,则必须在上下文中注册一个默认轮询器。有关更多详细信息,请参阅 端点命名空间支持。 |
轮询端点的默认触发器是具有 1 秒固定延迟周期的 PeriodicTrigger 实例。 |
重要:轮询器配置
所有
在第一个配置中,轮询任务每次轮询执行一次,并且在每个任务(轮询)期间,根据
请注意,没有指定 但是,在 但是,如果您确定您的方法可以返回 null,并且您需要为每次轮询中可用的所有源轮询,则应将
从 5.5 版开始, 从 6.2 版开始, 另请参阅 全局默认轮询器 以获取更多信息。 |
配置出站通道适配器
outbound-channel-adapter
元素(用于 Java 配置的 @ServiceActivator
)还可以将 MessageChannel
连接到任何应使用发送到该通道的消息的有效负载调用的 POJO 消费者方法。以下示例显示了如何定义出站通道适配器
-
Java DSL
-
Java
-
Kotlin DSL
-
XML
@Bean
public IntegrationFlow outboundChannelAdapterFlow(MyPojo myPojo) {
return f -> f
.handle(myPojo, "handle");
}
public class MyPojo {
@ServiceActivator(channel = "channel1")
void handle(Object payload) {
...
}
}
@Bean
fun outboundChannelAdapterFlow(myPojo: MyPojo) =
integrationFlow {
handle(myPojo, "handle")
}
<int:outbound-channel-adapter channel="channel1" ref="target" method="handle"/>
<beans:bean id="target" class="org.MyPojo"/>
如果正在适配的通道是 PollableChannel
,则必须提供一个轮询器子元素(@ServiceActivator
上的 @Poller
子注释),如下例所示
-
Java
-
XML
public class MyPojo {
@ServiceActivator(channel = "channel1", poller = @Poller(fixedRate = "3000"))
void handle(Object payload) {
...
}
}
<int:outbound-channel-adapter channel="channel2" ref="target" method="handle">
<int:poller fixed-rate="3000" />
</int:outbound-channel-adapter>
<beans:bean id="target" class="org.MyPojo"/>
如果 POJO 消费者实现可以在其他 <outbound-channel-adapter>
定义中重复使用,则应使用 ref
属性。但是,如果消费者实现仅由 <outbound-channel-adapter>
的单个定义引用,则可以将其定义为内部 Bean,如下例所示
<int:outbound-channel-adapter channel="channel" method="handle">
<beans:bean class="org.Foo"/>
</int:outbound-channel-adapter>
不允许在同一个 <outbound-channel-adapter> 配置中同时使用 ref 属性和内部处理程序定义,因为这会导致不明确的情况。这种配置会导致抛出异常。 |
任何通道适配器都可以在没有 channel
引用 的情况下创建,在这种情况下,它会隐式创建一个 DirectChannel
实例。创建的通道的名称与 <inbound-channel-adapter>
或 <outbound-channel-adapter>
元素的 id
属性匹配。因此,如果未提供 channel
,则需要 id
。
通道适配器表达式和脚本
与许多其他 Spring Integration 组件一样,<inbound-channel-adapter>
和 <outbound-channel-adapter>
也提供对 SpEL 表达式评估的支持。要使用 SpEL,请在 'expression' 属性中提供表达式字符串,而不是提供用于在 Bean 上进行方法调用的 'ref' 和 'method' 属性。当表达式被评估时,它遵循与方法调用相同的约定:<inbound-channel-adapter>
的表达式在评估结果为非空值时生成消息,而 <outbound-channel-adapter>
的表达式必须等效于 void 返回方法调用。
从 Spring Integration 3.0 开始,<int:inbound-channel-adapter/>
也可以使用 SpEL <expression/>
(甚至使用 <script/>
)子元素进行配置,以满足简单 'expression' 属性无法实现的更复杂的需求。如果使用 'location' 属性提供脚本作为 Resource
,则还可以设置 refresh-check-delay
,这允许定期刷新资源。如果希望在每次轮询时检查脚本,则需要将此设置与轮询器的触发器协调,如下例所示
<int:inbound-channel-adapter ref="source1" method="method1" channel="channel1">
<int:poller max-messages-per-poll="1" fixed-delay="5000"/>
<script:script lang="ruby" location="Foo.rb" refresh-check-delay="5000"/>
</int:inbound-channel-adapter>
使用 <expression/>
子元素时,另请参阅 ReloadableResourceBundleExpressionSource
上的 cacheSeconds
属性。有关表达式的更多信息,请参阅 Spring 表达式语言 (SpEL)。有关脚本,请参阅 Groovy 支持 和 脚本支持。
<int:inbound-channel-adapter/> (SourcePollingChannelAdapter ) 是一个端点,它通过定期触发以轮询某些底层 MessageSource 来启动消息流。由于在轮询时没有消息对象,因此表达式和脚本无法访问根 Message ,因此在大多数其他消息传递 SpEL 表达式中可用的有效负载或标头属性不可用。脚本可以生成并返回一个包含标头和有效负载的完整 Message 对象,或者仅返回有效负载,框架会将其添加到具有基本标头的消息中。 |