响应流模式(执行长时间任务)

如果一个服务需要执行比较长的时间,没有任何返回,超过设置的超时时间后,前端就会收到504,在某些网络环境下,还会造成网络重试。

系统支持在调用长时间服务时,实时返回执行进度,不造成超时,且界面上可以显示进度条。运行效果如下图所示

图 2

系统提供响应流模式,利用 ProgressiveTaskUtil 实时通知客户端处理进度,保持响应流的连续。

启用响应流模式

定义服务时,选中“启用响应流模式”

图 0

在服务中

  • 首先调用 ProgressiveTaskUtil.getCurrentTask 方法获取当前任务
  • 然后根据业务处理情况,择机调用当前任务的 setPercent 方法,设置后,前端即可收到设置的百分比
  • 最后正常返回数据

Java 代码如下:

public String longTimeExec() throws Exception {
    ProgressiveTask<String> task = ProgressiveTaskUtil.getCurrentTask();
    for (int i = 0; i <= 100; i++) {
        Thread.sleep(100);
        JSONObject extInfo = new JSONObject();
        task.setPercent(i, "进度", extInfo);// 后两个参数不能为空
    }
    Thread.sleep(100);
    return "OK";
}

涉及到的引用如下

import com.alibaba.fastjson.JSONObject;
import com.justep.util.progressive.ProgressiveTaskUtil;
import com.justep.util.progressive.ProgressiveTaskUtil.ProgressiveTask;

前端获取进度

前端页面调用服务,在响应进度消息事件中,获取百分比

  • 使用服务请求组件
//在响应进度消息事件中,获取百分比
onServiceRequest0Message = (event) => {
    this.comp("pageData").setValue("percent",event.message.percent);
}

//在请求成功事件中,获取返回数据
onServiceRequest0Success = (event) => {
    message.info(event.data);
}
  • 使用 this.request
onButton1Click = async (event) => {
    let {data} = await this.request({
        url:"$serviceName/main/fuwu/longtimeservice"
    })
    //在响应进度消息事件中,获取百分比
    data.on("message",(message)=>{
        this.comp("pageData").setValue("percent",message.percent);
    })
    //在请求成功事件中,获取返回数据
    data.on("done",(data)=>{
        message.info(data);
    })
}

运行效果如下图所示

图 2

可以看到响应头中的 Content-Type 是 text/event-stream;charset=UTF-8

results matching ""

    No results matching ""