问题标签 [spring-async]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
199 浏览

spring - 一起使用 Spring `@Scheduled` 和 `@Async` 的设计注意事项

@Scheduled我对一起使用 Spring和@Async功能有一些疑问。

假设我的要求是每 1 秒处理来自数据库的 5 行,因此在调度程序线程的 1 次传递中将创建 5 个异步线程来处理数据库中的每一行。

我的问题如下:

1)是否有另一种方法来创建 5 个 ascynchonis 线程,而不是在预定方法中使用 while 循环?

我看到这种方法的一个问题是线程池活动计数可能不等于最大池大小,因此循环不会在 1 秒过去之前中断。

2) 在某些情况下,AsyncService 中的日志语句 ieExecuting dbItem on the following asyncExecutor : task-scheduler-1显示 task-scheduler-1为线程名称,而不是async_thread_我一直期望的?

3) 如果我的调度程序线程运行时间超过 1 秒,调度程序的后续通过会发生什么?

异步执行器:

它被注入到具有预定方法的类中:

0 投票
3 回答
6731 浏览

java - 多次调用返回 DeferredResults 的异步服务而不增加执行时间

我的应用程序应该有 2 个核心端点:pushpull用于发送和获取数据。

拉取操作应该异步工作并产生 DeferredResult。当用户调用 pull service over rest 时,会创建新的 DeferedResult 并将其存储到Map<Long, DefferedResult> results = new ConcurrentHashMap<>()等待新数据的位置或直到超时到期。

推送操作也会调用用户休息,并且此操作会检查结果映射以查找此操作推送的数据的接收者。当 map 包含接收者的结果时,这些数据被设置为他的结果,DefferedResult 被返回。

这是基本代码:

代码按我预期的那样工作,问题是它也应该适用于多个用户。我猜将调用拉操作的最大活动用户最多为 1000。因此,每次调用 pull 最多需要 5 秒,正如我在 DeferedResult 中设置的那样,但事实并非如此。

正如您在图片中看到的,如果我立即从我的 javascript 客户端多次调用其余的 pull 操作,您可以看到任务将按顺序执行而不是同时执行。我上次触发的任务大约需要 25 秒,但我需要当 1000 个用户同时执行拉操作时,该操作最多需要 5 秒 + 延迟。

在此处输入图像描述

如何配置我的应用程序以同时执行这些任务并确保每个任务大约 5 秒或更短(当另一个用户向等待用户发送内容时)?我尝试将此配置添加到属性文件中:

还有这个配置:

但这并没有帮助,仍然是相同的结果。你能帮我配置一下吗?

编辑:

这就是我从角度调用此服务的方式:

当我尝试使用这样的纯 JS 代码多次调用它时:

它将更快地执行每个请求调用(大约 7 秒)。我预计增加是导致数据库调用服务,但它仍然优于 25 秒。以角度调用此服务有什么问题吗?

编辑2:

我尝试了另一种形式的测试,而不是浏览器,我使用了 jMeter。我在 100 个线程中执行 100 个请求,结果如下:

在此处输入图像描述

如您所见,请求将按 10 进行,达到 50 个请求后应用程序抛出异常:

我还注释了我使用存储库的代码,以确保数据库没有任何内容,并且结果相同。此外,我使用 AtomicLong 类为每个请求设置了唯一的 userId。

编辑 3:

当我发表评论时,我发现@Transactional一切正常!那么你能告诉我如何在不增加延迟的情况下为大量操作设置spring的事务吗?

我添加spring.datasource.maximumPoolSize=1000了我认为应该增加的池大小,所以唯一的问题是如何使用@Transactional 加速方法。

每个对 pull 方法的调用都用 @Transactional 注释,因为我首先需要从数据库加载数据并检查是否有新数据,因为是的,我不必创建等待延迟结果。push 方法也必须使用 @Transaction 进行注释,因为我首先需要将接收到的数据存储在数据库中,然后将该值设置为等待结果。对于我的数据,我使用的是 Postgres。

0 投票
1 回答
1492 浏览

java - 测量异步方法的执行时间

我有异步方法,我使用 DeferredResult 作为返回类型。我想为那个方法编写junit测试,我在循环中调用这个方法,例如100次,我需要测量每次调用该方法的执行时间。

这是方法示例:

创建了 deferredResult 我添加到集合中,并在另一个方法中迭代该集合,在该方法中设置了一些结果,然后返回 dr。

你能告诉我应该如何测试我将能够测量该方法的多次调用的执行时间吗?

谢谢。

0 投票
0 回答
60 浏览

java - 在 spring 中调用异步方法中的方法

刚刚经历了 spring Async 进程,该进程根据配置调用具有多个线程的方法。只是想检查以下情况。我可以在异步方法中调用方法吗?例如:

请注意,除了记录器和一些常量外,没有类级别的变量。只是想了解上述场景的陷阱以及如何克服它们。这在本地运行中运行良好。但不确定这在集群中超过 1 个服务器中具有多个 jvm 的应用程序服务器中会如何表现。任何帮助/指针都会很棒。

0 投票
2 回答
3172 浏览

java - 在一个 @Async 方法中使用的线程池与其他异步方法执行共享

我有一个初始化为@Bean 的线程池,用于专门执行特定的@Async 方法

上面的线程池作为 bean 用于 Async 方法调用,如下所示:

还有其他类也使用默认的 Spring @Async 池,例如:

在运行应用程序时,我可以在日志中看到以下内容:

我看到上面的日志片段随机打印出来,异步方法被默认线程池和自定义线程池间歇性地执行

我确实有从非异步方法调用 @Async 方法的场景

但是,我只在 MyHandler 中使用了一个 @Async 方法 handle() 并且没有其他地方使用我的自定义线程池

为什么 spring 混合线程池(自定义和默认)来执行 @async 方法?

在 @Async 方法注解中传递 bean 名称有什么用?

我如何使用一种特定的异步方法拥有专用的线程池,以便在它不执行时让线程池处于空闲状态并且不用于其他异步方法,这些方法应该只在默认弹簧线程池中执行

关于我的环境的详细信息:Spring boot 版本 1.4.2 RELEASE JDK 1.8.0

0 投票
0 回答
195 浏览

java - 如何在 Spring @Async 方法中获取任务

如何在 Spring @Async 方法中获取任务?因为我想返回 FutureTask,但是 futureTask 的构造函数需要传递 Runnable 或 Callable 参数。

预期的

0 投票
2 回答
4382 浏览

spring - 在@RestController 中限制时间执行的最佳方法

考虑以下代码:

我想要完成的是,如果call来自10 秒的方法TestService需要超过 10 秒,我想取消它并生成带有HttpStatus.REQUEST_TIMEOUT代码的响应。

0 投票
4 回答
10208 浏览

spring - 异步 REST API 生成警告

我正在使用 Spring Boot 应用程序。我有一个返回 Callable 的休息控制器。

一个 ThreadPoolTask​​Executor 配置如下:

}

2018-09-19 00:43:58.434 WARN 10104 --- [XNIO-2 task-28] oswcrequest.async.WebAsyncManager : !!! 需要一个 Executor 来处理 java.util.concurrent.Callable 返回值。请在“异步支持”下的 MVC 配置中配置一个 TaskExecutor。当前使用的 SimpleAsyncTaskExecutor 在负载下不适合。

但是在访问 api 服务器时会产生以下警告

0 投票
2 回答
3729 浏览

java - java.sql.SQLNonTransientException: [Amazon][JDBC](10900) 并非所有参数都已填充

我正在构建一个使用 Spring @EnableAsync 和 @Async 注释的多线程 Spring Boot 应用程序。当我使用单线程(CorePoolSize 1,MaxPoolSize 1)运行应用程序时,一切都按预期工作。当我在似乎随机出现的情况下将池大小增加到 1 以上时,我得到java.sql.SQLNonTransientException: [Amazon]JDBC Not all parameters have been packed。调用 Amazon AWS Redshift 数据库时出错。

在 ServiceProcessBean.java 中,我自动连接了我的 ProcessService 类(要完成的线程工作)和 ShipmentDAO,它加载了要由 ProcessService.process() 方法处理的装运 ID 列表,代码如下。

最后,在 ProcessService 中,我们自动连接多个存储库和一个 JSON 服务,并使用 @Async 注释开始 process() 方法。请参阅下面的代码片段。

最后,在 ShipmentDAO 中,我们有 getOneBy() 方法,它返回请求的货运记录。

我已经联系了 AWS,他们的知识库中只有两个实例,其中报告了这个错误,只有“用户代码问题”是解决方案。

我没有看到任何明显的线程安全问题,但它的行为就像这样,因为当只触发一个线程并且每批货物都按顺序处理时,代码可以完美地工作。

有没有人看到明显的问题或需要更多信息?任何帮助表示赞赏。

堆栈跟踪如下:

0 投票
1 回答
164 浏览

java - 重定向 URI 不适用于 DeferredResult

下面是我用来响应此 API 的代码示例。

注意:URI 是相对的,不是绝对的 URI。

错误出现:HTTP ERROR 408(此页面不工作)

虽然,当我在响应正文中写入字节时,我对DeferredResult 的响应工作正常,如下所示: output.setResult(ResponseEntity.status(HttpStatus.OK).body(responseData.getBytes()));

我应该怎么做才能在延迟响应中回复特定的 URI?