java - ParallelStream 和 Spring 异步
问题描述
我有一个包含大量数据的列表,我想对每个项目进行一些计算/逻辑。
它正在调用 spring Service 方法来执行逻辑。我有点困惑,哪一种是使用异步最快的正确方法。
现在我只是通过 parrallelStream 调用该方法,如下所示
items.getItems().parallelStream().forEach(item -> addItem(item));
但我仍然看到性能问题,它不完全是异步/快速的,我认为这是由于方法不是异步的,因为只有 1 个 bean 1 方法处理所有事情。
我想知道将异步添加到方法中是否会提高性能。或者这是正确的方法。如果我将异步添加到方法中,我应该只用流替换 parrallelStreams 吗?
或者有没有更好的方法来提高性能。
[编辑]
为了使问题更清楚,用户调用具有大列表的端点,我想对项目执行业务逻辑并返回更新的列表。
解决方案
- 使用在单个项目上实现业务逻辑的方法创建一个单例 bean。
- 创建队列
- 创建一个 Spring Scheduler,它定期从队列中获取一项并异步运行 bean 来处理它。
一般来说,您应该更喜欢使用 Spring 功能进行异步计算而不是 java 功能。
如果列表很大,请不要忘记通常为 30 秒的 http 调用超时。
如果计算需要更长的时间,您的 REST API 应该接受该列表,创建一个任务并检索 http 状态 203_ACCEPTED 并在单独的线程中执行任务。
推荐阅读
- azure - Cosmos DB 将属性从 PascalCase 转换为 CamelCase
- wordpress - 如何创建可在 Internet 访问可用时上传的离线表单?
- firebase - 如果链接未注册,Firebase 动态链接默认行为
- c++ - Visual Studio 2019 编译构建
- sql - 使用 case 语句 SQL 的单个查询中的多个计数
- python - Sklearn:如何处理数据帧
- python-3.x - 如何改变元组的形状?
- python-3.x - Python 不会打印 NOP
- sql - 仅当产品大于上个月时,我才需要 Oracle 查询以获取产品的销售额
- python - 重新运行单元格要求用户输入时,Jupyter Notebook 冻结