我有一个远程服务,当发生特定事件时,我正在调用它来加载产品的定价数据。一旦加载,产品定价就会被广播给另一个消费者以在其他地方处理。
调用代码不关心响应 - 它是即发即弃的,响应应用程序事件并触发新的工作流程。
为了使调用代码尽可能快,我想在这里使用@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
方法上声明它(这似乎是一个更合适的地方),则永远不会调用聚合器。
为什么?