Spring Integration - JPA入站通道适配器,拆分器,服务激活器并发工作单元

时间:2017-05-26 11:55:56

标签: spring spring-integration

我有一个非常简单的Spring集成管道设置

  1. 将状态为X且带有JPA的N次资产加载到频道
  2. 将每个JPA实体拆分为新渠道
  3. 使用服务激活器处理JPA实体,最后将实体的状态更新为Y
  4. 此管道的同步特性意味着JPA入站通道适配器仅触发前一个入站通道适配器中的所有消息,并且已经处理了拆分通道并发送到nullChannel

    效果很好,但效率很低。

    服务激活器做了一些事情,其中​​之一是它调用外部REST API,然后更新资产的状态,因此它将从#1中排除。

    这里的问题是服务激活器需要大约1秒来处理单个消息(大部分时间是对REST API的调用),因此,250个JPA实体的队列可能需要250秒来处理

    如果我们同时调用REST API,比如说5次,那么它仍然需要1秒钟。

    所以,我想知道我们是否可以对我们的管道进行简单的更改,可能添加AggregatorTask 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" />
    

1 个答案:

答案 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必须为ExecutorChannelnewAssetServiceActivator必须输出到aggregator。聚合器没有output-channel表示对gateway的回复。