我有一个非常简单的Spring集成管道设置
此管道的同步特性意味着JPA入站通道适配器仅触发前一个入站通道适配器中的所有消息,并且已经处理了拆分通道并发送到nullChannel
效果很好,但效率很低。
服务激活器做了一些事情,其中之一是它调用外部REST API,然后更新资产的状态,因此它将从#1中排除。
这里的问题是服务激活器需要大约1秒来处理单个消息(大部分时间是对REST API的调用),因此,250个JPA实体的队列可能需要250秒来处理
如果我们同时调用REST API,比如说5次,那么它仍然需要1秒钟。
所以,我想知道我们是否可以对我们的管道进行简单的更改,可能添加Aggregator
和Task Executor
,这将允许整个管道作为同步& #34;工作单元",但允许Service Activator
同时处理。
这是集成配置
<channel id="newAssetChannel" />
<channel id="splitAssetChannel" />
<int-jpa:inbound-channel-adapter
id="newAssetChannelAdapter"
channel="newAssetChannel"
entity-manager-factory="entityManagerFactory"
entity-class="com.foo.domain.Asset"
jpa-query="select a from Asset a where (a.status = 'NEW' or a.status = 'UPDATED') and a.health = 'OK' ORDER BY a.priority DESC, a.updatedDate ASC"
max-results="250">
<poller fixed-rate="5000" max-messages-per-poll="1" />
</int-jpa:inbound-channel-adapter>
<splitter expression="payload"
input-channel="newAssetChannel"
output-channel="splitNewAssetChannel" />
<service-activator
id="newAssetServiceActivator"
input-channel="splitNewAssetChannel"
output-channel="nullChannel"
ref="assetProcessor"
method="processNew" />
答案 0 :(得分:1)
嗯,aggregator
确实是等待所有回复的正确方法,但是ExecutorChannel
之后splitter
你也可以免费使用poller的手。所以,你应该在并行拆分聚合之前有一些障碍。
您可以使用<gateway>
:
<gateway id="gateway" default-request-channel="splitterChannel"/>
<service-activator id="gatewayTestService" input-channel="newAssetChannel" output-channel="saveRowsChannel" ref="gateway"/>
分割器output-channel
必须为ExecutorChannel
。 newAssetServiceActivator
必须输出到aggregator
。聚合器没有output-channel
表示对gateway
的回复。