java后端实现返回子线程进度条

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iuie_sl/article/details/63319114

在一个项目有一个需求是这样的,在上传一个文件后,后台加载文件插入临时表,再重临时表中查出数据返回客户端,最后在进行一段比较费时的数据计算。在计算完成前整个页面都是锁住的,用户不能做任何操作,直到计算完成,需求希望的优化是,返回数据到客户端后就直接退出,页面解锁,最后的计算由一个子线程去计算,然后在页面上显示计算的进度条。

提取要点

1:一个子进程进行计算
2:计算过程中返回计算的百分比,比如10%,20%。。。。。100%;
3:前端需要一个定时器不断请求进度,然后更新进度条。

项目架构
这里写图片描述
项目采用标准的三层架构,持久层,业务层,控制层。持久层和业务层是采用ejb在jobss容器中启动的,控制器是采用jsf在jetty中启动的。

基于这样架构的的请求分析
这里写图片描述

1: 客户端发起上传请求
2: jetty的控制器把返回前端的数据准备好后,就开启一个新的线程,进行计算,并将前台数据返回,这个请求线程就结束了。
3: 新开的子线程调用jboss中的方法,在调用jboss的方法时在jboss中创建了一个新的线程,并且new了一个jboss中调用方法所在的类。
4: 对了方法的的进度,我们采用当调用方法中的第几步时返回固定的百分比,这个百分比是根据方法的总时间和到这一部所花的时间手动计算,自己写死的。
5: 在客户端用js创建一个定时器,定时请求我们返回的百分比。
6: 这个请求百分比的请求线程,调用jetty中的方法,jetty中的方法调用jboss的获取百分比的方法,这调用时在jboss中创建了一个新的线程,并且new了一个新的services.
7: jetty获取百分比后返回到客户端,不断更新进度条,直到100%的时候清除定时器。

问题
通过什么来传递这个百分比耶?。计算修改的百分比和获取百分比的方法不在一个线程中,在两个相同的service中.

1: string,int类型,显然是不行,如果是全局的,在两个线程中是可以互相获取的,但是因为他们在两个相同的service中,只能获取自己的string和int不能获取别人的的string,int.无法实时更新。
2: 既然在两个相同的service中可以共享,在两个线程中可以共享,我想到了全局的单例对象作为传递进度,获取全局的类的属性。
全局的单例对象

package com.synnex.biz2.hyve.loosegear.mrp.util;

import java.io.Serializable;

public class CalculatePercentage implements Serializable{

    private static final long serialVersionUID = -3657140359108436779L;

    private static final CalculatePercentage  calculatePercentage=new CalculatePercentage();

    private CalculatePercentage(){

    }
    public static CalculatePercentage newInstance(){
        return calculatePercentage;
    }
    private String percentage;

    public String getPercentage() {
        return percentage;
    }

    public void setPercentage(String percentage) {
        this.percentage = percentage;
    }

    public CalculatePercentage(String percentage) {
        super();
        this.percentage = percentage;
    }


}

使用

private  final CalculatePercentage  calculatePercentage= CalculatePercentage.newInstance();

这是我写了2年web项目以来第一次越到多线程的问题,也是我到实习公司遇到的第一个比较难的问题,花了一天时间终于把问题理顺解决了,如果有写的不对的欢迎指导,比较我对ejb,jobss都不是很熟,中途经过很多步骤才了解了这个请求的过程。

猜你喜欢

转载自blog.csdn.net/iuie_sl/article/details/63319114