Spring Integration + @Aysnc - Gateway vs ServiceActivator

时间:2013-04-03 21:07:50

标签: java spring spring-integration

当有特定事件发生时,我正在调用一个远程服务来加载产品的定价数据。加载后,产品定价将被广播给另一个消费者,以便在其他地方进行处理。

调用代码不关心响应 - 它是即发即忘,响应应用程序事件,并触发新工作流。

为了尽可能快地保持调用代码,我想在这里使用@Async,但我的结果好坏参与。

基本流程是:

CallingCode -> ProductPricingGateway -> Aggregator -> BatchedFetchPricingTask

这是异步设置:

<task:annotation-driven executor="executor" scheduler="scheduler"/>
<task:scheduler id="scheduler" pool-size="1" />
<task:executor id="executor" keep-alive="30" pool-size="10-20" queue-capacity="500" rejection-policy="CALLER_RUNS" />

使用的另外两个组件是@Gateway,其中包含启动代码,以及位于聚合器后面的下游@ServiceActivator。 (呼叫被分成小组)。

public interface ProductPricingGateway {    
    @Gateway(requestChannel="product.pricing.outbound.requests")
    public void broadcastPricing(ProductIdentifer productIdentifier);
}

// ...elsewhere...
@Component
public class BatchedFetchPricingTask {
    @ServiceActivator(inputChannel="product.pricing.outbound.requests.batch")
    public void fetchPricing(List<ProductIdentifer> identifiers)
    {
        // omitted
    }
}

另一个相关的整合配置:

<int:gateway service-interface="ProductPricingGateway"
    default-request-channel="product.pricing.outbound.requests" />

<int:channel id="product.pricing.outbound.requests" />
<int:channel id="product.pricing.outbound.requests.batch" />

我发现如果我在@Async方法上声明@ServiceActivator,它就可以了。 但是,如果我在@Gateway方法(这似乎是一个更合适的位置)上声明它,则永远不会调用聚合器。

为什么?

1 个答案:

答案 0 :(得分:1)

我很难看到@Async在这里的工作方式,因为起点是代码调用ProductPricingGateway.broadcastPricing()方法的时候。

在gw上有@Async,调度程序会发送什么?

同样,对于服务上的@Async,调度程序会在identifiers中传入什么内容?

尽快让异步同步的正确方法是让product.pricing.outbound.requests成为ExecutorChannel ......

http://static.springsource.org/spring-integration/reference/html/messaging-channels-section.html#executor-channel

http://static.springsource.org/spring-integration/reference/html/messaging-channels-section.html#channel-configuration-executorchannel

...调用线程将消息移交给任务执行者。