HTTP POST (사용자가 아닌 응용 프로그램에서 생성) 이후 전자 메일을 보내려고합니다. 전자 우편을받는 절차가 올바르지 만 Java 웹 응용 프로그램 서버가 어떻게 작동하는지 잘 모르겠습니다.doGet 또는 doPost에서 잠재적으로 긴 작업을 처리하는 방법은 무엇입니까?
나는 특히 타임 아웃이 걱정되며, 중요한 스레드를 어떻게 든 막는 지 알고 싶다.
나는 다음과 같은 일을하는 경우 :
@Override
public void doPost(
final HttpServletRequest req,
final HttpServletResponse resp
) throws IOException, ServletException {
final PrintWriter pw = resp.getWriter();
pw.write(...);
pw.flush();
pw.close();
// Here I'm sending an email, this can potentially
// block until the email send procedure times out
// (the timeout is set to 5 seconds)
sendEmail(...);
}
그리고 이메일 서버가 다운되면 내 sendEmail 시간 초과 (타임 아웃이 내가 몇 초로 설정하는) 때까지 스레드가 차단됩니다
.어떤 스레드를 차단합니까? 내 말은, 분명히이 POST를 처리하고있는 스레드를 차단하고 있지만 이것이 문제라는 것을 알 수 있습니까? 이 스레드가 다음에해야 할 일은 무엇입니까?
나는 자바 웹 응용 프로그램 서버에서 새 스레드를 만들어서는 안된다는 것을 읽었으므로 다음과 같이해야하지 않겠습니까? 내 질문에 보내는 이메일을 특정하지
Thread t = new Thread(new Runnable() {
public void run() {
sendEmail();
}
});
t.start();
참고 : 나는 자바 웹 애플리케이션마다에서 알아서해야 이해하려는 당신은 GET 또는 이후에 잠재적으로 차단/긴 작업을 할 계획 게시하다.
서블릿은 언제 배포 해제됩니까? 예를 들어 .war을 배포 해제하고 재배포 할 때? 만약 내가 죽지 않는다면 Tomcat을 재시작하지 않고 Tomcat이 내 .war 파일을 배포 해제/재배포 할 때마다 더 이상 아무 것도하지 않는 스레드가 더 많이 생길 것입니다. (정확히 이해하고 있습니까?) – NoozNooz42
컨테이너에 따라 다르지만 .war의 배포 해제 및 재배포는'destroy'를 호출해야합니다. 아마도 컨테이너에 의존하여 컨테이너를 올바르게 사용할 수 있습니다 (그러나 확실히하기 위해 일부 로그인하는 것은 아쉽지 않습니다). 하나의 서블릿 인스턴스에서'init'을 두 번 호출하면 서블릿 스펙을 충족시키지 못하기 때문에 매우 놀랍습니다. –