pdf 생성 요청을 처리하는 데 약 10 분이 소요되는 서버에서 장기 실행 프로세스에 대한 솔루션을 구현하려고합니다. 5 분에 브라우저가 지루하거나 시간 초과되었습니다. 나는 Ajax와 쓰레드를 사용하여 이것을 처리하려고 생각했다. 나는 아약스를위한 정규 자바 스크립트를 사용하고있다. 그러나 나는 그것에 매달렸다.Ajax 및 스레드를 사용하여 서버에서 장기 실행 jsp 요청 처리
나는 그것이 서블릿에 요청을 전송하고 서블릿이 thread.Please이
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>My Title</title>
<script language="JavaScript" >
function getXMLObject() //XML OBJECT
{
var xmlHttp = false;
xmlHttp = new XMLHttpRequest(); //For Mozilla, Opera Browsers
return xmlHttp; // Mandatory Statement returning the ajax object created
}
var xmlhttp = new getXMLObject(); //xmlhttp holds the ajax object
function ajaxFunction() {
xmlhttp.open("GET","HelloServlet" ,true);
xmlhttp.onreadystatechange = handleServerResponse;
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlhttp.send(null);
}
function handleServerResponse() {
if (xmlhttp.readyState == 4) {
if(xmlhttp.status == 200) {
document.forms[0].myDiv.value = xmlhttp.responseText;
setTimeout(ajaxFunction(), 2000);
}
else {
alert("Error during AJAX call. Please try again");
}
}
}
function openPDF() {
document.forms[0].method = "POST";
document.forms[0].action = "HelloServlet";
document.forms[0].submit();
}
function stopAjax(){
clearInterval(intervalID);
}
</script>
</head>
<body><form name="myForm">
<table><tr><td>
<INPUT TYPE="BUTTON" NAME="Download" VALUE="Download Queue (PDF)" onclick="openPDF();">
</td></tr>
<tr><td>
Current status: <div id="myDiv"></div>%
</td></tr></table>
</form></body></html>
그러나 아래의 코드 여기
public class HelloServlet extends javax.servlet.http.HttpServlet
implements javax.servlet.Servlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("POST request!!");
LongProcess longProcess = new LongProcess();
longProcess.setDaemon(true);
longProcess.start();
request.getSession().setAttribute("longProcess", longProcess);
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
class LongProcess extends Thread {
public void run() {
System.out.println("Thread Started!!");
while (progress < 10) {
try { sleep(2000); } catch (InterruptedException ignore) {}
progress++;
}
}
}
내 AJAX 호출이를보고 시작하는 지점까지 도달 스레드가 프로세스가 완료되었고 어떻게 AJAX가 호출하여 요청 상태를 확인해야하는지 브라우저와 통신하는 방법을 더 진행하는 방법을 알지 못합니다.
일부 자료가 누락 되었다면 알려주십시오. 유용한 경우 제안.
대단히 감사합니다. 문제는 내가 서블릿 3.0을 사용할 자유가 없다는 것입니다. 레거시 애플리케이션이며 전체 시스템은 다시 구현됩니다. 서블릿 2.x에 충실해야 할 것입니다 : ( –
@ JohnBlue :이 경우 주기적으로 백그라운드 프로세스 상태를 확인할 수 있습니다 - 약간 번거롭지만 작동하는 것으로 확인되었습니다 –
물론 같은 생각입니다. 서블릿과 long 프로세스 스레드 간의 스레드 조합 및 AJAX에서의 폴링 중간 화면을 도입해야합니까? –