在 html 页面中显示多个线程(由 spring async 生成)的进度

show progress of multiple threads (generated by spring async) in html page

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

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

提前致谢。

我最终得到了 2 个答案,我在 : first helpful answer 一开始我看不懂是因为我当时不知道什么是 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>

您可以在 progress element style

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

然后我添加了 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 秒执行一次帧函数。我选择 5 不消耗我与 Db 的连接。

ajax函数会向指定的url发送get请求,如果响应成功则将return值赋值给progress变量在success:function(progress)中,即可在 java 脚本 here

中找到 link 最流行的 http 请求方式

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

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

在我的控制器中:

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

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

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