HTTP POST(由应用程序生成,而不是由用户生成)之后,我想发送电子邮件。我收到了电子邮件发送程序,但我不确定Java webapp服务器是如何工作的。如何处理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的线程,但这是一个问题?这个线程应该接下来做什么?
我读过,我不应该从Java webapp服务器创建新线程,所以我认为我不应该做下面的权利?
Thread t = new Thread(new Runnable() {
public void run() {
sendEmail();
}
});
t.start();
请注意,我的问题是不特定于电子邮件发送:我想了解在一个Java Web应用程序每次要照顾你计划一个GET或后做可能阻塞/长操作POST。
比如我可以把所有帖子的电子邮件上的请求队列,并有另一个(唯一的)线程出列他们,送他们。但这意味着我必须产生至少一个其他线程。这可以吗? – NoozNooz42 2010-12-21 23:10:34
在我的情况下,它不是用户,而是另一个执行POST的应用程序。但是,无论如何,用户发送这些POST的位置并不是用户在关闭流后立即返回页面的位置? (在尝试发送电子邮件之前我会这样做) – NoozNooz42 2010-12-21 23:11:51