使用Spring @Async和ThreadPoolTask​​Scheduler,pool-size = 1

fis*_*tte 2 java spring asynchronous threadpool threadpoolexecutor

我们在基于Spring的Web应用程序中有一个服务实现,它增加了db中的一些统计计数器.由于我们不想弄乱用户的响应时间,因此我们使用Spring的@Async异步定义它们:

public interface ReportingService {

    @Async
    Future<Void> incrementLoginCounter(Long userid);

    @Async
    Future<Void> incrementReadCounter(Long userid, Long productId);
}
Run Code Online (Sandbox Code Playgroud)

和spring任务配置如下:

<task:annotation-driven executor="taskExecutor" />
<task:executor id="taskExecutor" pool-size="10" />
Run Code Online (Sandbox Code Playgroud)

现在,有pool-size="10"两个线程尝试两个线程时,我们会遇到并发问题,创建包含计数器的相同初始记录.

这里设置pool-size="1"避免这些冲突是一个好主意吗?这有副作用吗?我们有很多地方可以触发异步操作来更新统计信息.

Joh*_*n B 7

与单个线程处理它们的速度相比,副作用将取决于将任务添加到执行程序的速度.如果每秒添加的任务数大于单个线程可以在一秒钟内处理的数量,那么随着时间的推移,运行队列的风险会增加,直到最终出现内存不足错误.

查看此页面上的执行程序部分任务执行.他们声称拥有无限队列并不是一个好主意.

如果您知道可以比添加任务更快地处理任务,那么您可能是安全的.如果没有,您应该添加队列容量并在队列达到此大小时处理输入线程阻塞.