首页 > 解决方案 > 在 html 页面中显示多个线程的进度(由 spring async 生成)

问题描述

我正在使用带有异步注释的线程池任务执行器,我有 100000 个操作通过使用 spring 线程池任务执行器的多个线程划分。这意味着每个有 200 个线程将循环执行 500 个操作。我想在 html 进度条中显示所有这些操作的进度。最好的方法是什么?如何?。使用未来对象或网络套接字怎么样?

编辑:我尝试使用调用 api 的 Ajax 函数,该函数从我的 sql dB 中检索数据......它正在工作,但对 dB 的频繁请求会耗尽应用程序并消耗与 dB 的连接。

提前致谢。

标签: htmlspring-mvcthreadpoolexecutor

解决方案


我最终得到了 2 个答案: 第一个有用的答案我首先无法理解它,因为当时我不知道 ajax 是什么,但是在花了一些时间之后,我使用它并进行了一些修改以使其在我的jsp 我添加了我的进度条 div:

<div class="row">
<div class="progress">
    <div id="progressBar" class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" aria-valuenow="70"
                             aria-valuemin="0" aria-valuemax="100" style="width:0%;">
    <div id="label">0%</div>
    </div>
</div>
</div>

您可以找到进度元素的一些描述以及如何在进度元素样式中设置它的 样式

然后我添加了如下的jquery脚本

<script>
    $(document).ready(function () {
     
        var width = 0;
        var id = setInterval(frame, 5000);

        function frame() {
            if (width >= 100) {
                console.log("task is completed"+width);
                clearInterval(id);
                window.location.href = "completed_url";
            } else {
                console.log(width);
                $.ajax({
                    url: "/progress",
                    success: function (progress) {
                        $('#progressBar').css('width', progress + '%');
                        document.getElementById("label").innerHTML = progress * 1 + '%';
                        width = progress;
                    },
                });
            }
        }

    });
</script>

请注意,setInterval(frame, 5000) 将每 5 秒执行一次 frame 函数。我选择 5 以不消耗我与 Db 的连接。

ajax 函数将向指定的 url 发送 get 请求,如果成功响应,它将返回值分配给成功的进度变量:函数 (progress),您可以在此处找到在 java 脚本中执行 http 请求的最流行方式的链接

移动我使用 .css 函数的栏。

为了增加标签值,我使用了 document.getElementById("label").innerHTML。

在我的控制器中:

    @RequestMapping(value = "/progress", method = GET)
    public @ResponseBody
    int getProgress() {
        return myService.getProgress();
    }

每当任务执行器使用@Async 执行任务时,其状态将在数据库中更新,getProgress() 函数将从数据库中计算进度。

第二种不从 db id 查询使用原子整数来保存进度值的方法,但它似乎适用于一项任务。如果存在,我不知道如何区分对任务执行器的多个请求。


推荐阅读