响应流模式(执行长时间任务)
如果一个服务需要执行比较长的时间,没有任何返回,超过设置的超时时间后,前端就会收到504,在某些网络环境下,还会造成网络重试。
系统支持在调用长时间服务时,实时返回执行进度,不造成超时,且界面上可以显示进度条。运行效果如下图所示
系统提供响应流模式,利用 ProgressiveTaskUtil 实时通知客户端处理进度,保持响应流的连续。
启用响应流模式
定义服务时,选中“启用响应流模式”
在服务中
- 首先调用 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);
})
}
运行效果如下图所示
可以看到响应头中的 Content-Type 是 text/event-stream;charset=UTF-8