1

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

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

为了使调用代码尽可能快,我想在这里使用@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方法上声明它(这似乎是一个更合适的地方),则永远不会调用聚合器。

为什么?

4

1 回答 1

1

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

@Asyncgw 上,调度程序会发送什么?

同样,@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

...调用线程将消息传递给任务执行者。

于 2013-04-04T16:26:52.733 回答