2021SC@SDUSC
目录
一.问题提出
这里在实现的时候发现,服务器和安卓端在等待算法执行结束的漫长时间中,用户长时间只能等在一个界面中,体验感也会很差,因此选择异步通知的方式,用户开始处理视频后,直接返回主页面,在处理列表中,可以看到视频处理情况,不需要一直在等待界面中停留,体验感会大大提升。
二.实现方法
1.准备工作
我们发现,在用户请求接口后,直接断开,服务器这里是不会感知的,并且会继续执行完算法:
由于http是基于tcp的,在tcp中,客户端中断了连接,服务端是无法感知的,只能通过发心跳包来检测,而我们是没有发心跳包的,所以是不知道客户端已断开,而且web服务器也都没做这种中断机制,所以服务器依然会把客户端的请求走完。这就不用担心用户断开后,算法能否正常执行了。
测试代码:
<?php
$file = 'test-close.txt';
while(true){
file_put_contents($file, date('Y-m-d H:i:s').PHP_EOL, FILE_APPEND);
sleep(1);
}
在浏览器中访问
http://192.168.10.200/test.php
然后关掉这个请求
tail -f test-close.txt
可以看到,依然在不断写入,连接关闭5分钟后,仍然后端不停止工作。
2.实现思路
在实现过程中,我们在后端设置一个标记文件,只要算法执行结束,会在后台生成一个标志文件,前端会轮询向后端发送请求,询问是否处理完,后端根据tag标记来给前端返回是否剪辑完成的通知。tag使用id+视频名字判断是否冲突。
@RestController
@SpringBootApplication
public class callAlgorithmController {
@PostMapping("/callAlgorithm")
public void chunkUpload(String id,String name) throws IOException {
//传视频
System.out.print("F:/demo/temp/del_video/"+id+"_"+name);
System.out.print(id);
System.out.print(name);
upload("F:/demo/temp/del_video/"+id+"_"+name+".mp4",id,id+"_"+name);
//调用算法
call_three_algorithm(id,id+"_"+id+"_"+name,id+"_"+name+".mp4");
//生成标志
File f=new File("F:\\demo\\temp\\Tag\\"+id+"_"+name+".txt");
if(f.exists())
{
}else{
f.createNewFile();
}
}
}
package com.example.demo;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
@RestController
@SpringBootApplication
public class sceneTagController {
@PostMapping("/ifSceneFinished")
public String chunkUpload(String id,String name){
File f=new File("F:\\demo\\temp\\SceneTag\\"+id+"_"+name+".txt");
if(f.exists())
{
return "1";
}else{
return "0";
}
}
}
package com.example.demo;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
@RestController
@SpringBootApplication
public class TagController {
@PostMapping("/ifFinished")
public String chunkUpload(String id,String name){
File f=new File("F:\\demo\\temp\\Tag\\"+id+"_"+name+".txt");
if(f.exists())
{
return "1";
}else{
return "0";
}
}
}