我想从自己递归调用一个servlet直到我的操作完成。我需要这样做的原因是因为我的托管服务有一个必须满足所有RPC调用的硬截止日期。因此,我需要在可管理的块中拆分操作,并为每个块递归调用servlet,直到操作完成。
我觉得下面的代码应该可以工作,但是在打开并连接HttpURLConnection时它不会调用servlet。也没有错误。任何帮助将不胜感激。
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class ServletExample extends HttpServlet {
HttpServletRequest request;
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
request = req;
String strRequestIndex = request.getParameter("requestIndex");
int intRequestIndex = 0;
if (strRequestIndex != null) {
intRequestIndex = Integer.parseInt(strRequestIndex);
}
if (intRequestIndex < 10) {
try {
callSameServlet(intRequestIndex);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void callSameServlet(int requestIndex) throws Exception {
URL recursiveUrl = new URL(request.getRequestURL().toString()
+ "?requestIndex=" + (requestIndex + 1));
HttpURLConnection connection = (HttpURLConnection) recursiveUrl
.openConnection();
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.connect();
DataOutputStream dos = new DataOutputStream(
connection.getOutputStream());
dos.flush();
dos.close();
}
}
答案 0 :(得分:2)
关于你问题中暴露的技术问题:URLConnection
被懒惰地执行了。代码中的URLConnection#getOutputStream()
仅返回写入请求正文的句柄。您需要使用URLConnection#getInputStream()
实际触发HTTP请求并获取响应正文。
您的代码中存在更多问题:
你正在发出一个POST请求,但是你的servlet中没有一个doPost()
方法被定义。您需要触发正常的GET或实现doPost()
。但是,通过调查上面链接中描述的获得的错误响应,这将是显而易见的。
此外,您的servlet不是线程安全的。您永远不应该声明/分配请求/会话作用域数据作为servlet的实例变量。阅读this answer了解详情。
最后,您是否考虑过使用RequestDispatcher#include()
?这将在内部处理,并节省您触发HTTP请求的成本/开销。
request.getRequestDispatcher("servleturl").include(request, response);
然后,您可以使用请求属性而不是请求参数。顺便说一下,整个功能要求没有多大意义。我只是在你想要递归执行的代码上使用for
或while
循环。但这是一个不同的问题。