当有特定事件发生时,我正在调用一个远程服务来加载产品的定价数据。加载后,产品定价将被广播给另一个消费者,以便在其他地方进行处理。
调用代码不关心响应 - 它是即发即忘,响应应用程序事件,并触发新工作流。
为了尽可能快地保持调用代码,我想在这里使用@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
方法(这似乎是一个更合适的位置)上声明它,则永远不会调用聚合器。
为什么?
答案 0 :(得分:1)
我很难看到@Async
在这里的工作方式,因为起点是代码调用ProductPricingGateway.broadcastPricing()
方法的时候。
在gw上有@Async
,调度程序会发送什么?
同样,对于服务上的@Async
,调度程序会在identifiers
中传入什么内容?
尽快让异步同步的正确方法是让product.pricing.outbound.requests
成为ExecutorChannel
......
...调用线程将消息移交给任务执行者。