有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

每个访问者只启动一次线程的java Servlet

嘿,我想实现一个Java Servlet,它只为每个用户启动一次线程。即使在刷新时,也不应再次启动。我上次的方法给我带来了一些麻烦,所以没有代码^^。对servlet的布局有什么建议吗

 public class LoaderServlet extends HttpServlet {
// The thread to load the needed information
private LoaderThread loader;
// The last.fm account
private String lfmaccount;

public LoaderServlet() {
    super();
    lfmaccount = "";
}

@Override
protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    if (loader != null) {
        response.setContentType("text/plain");
        response.setHeader("Cache-Control", "no-cache");
        PrintWriter out = response.getWriter();
        out.write(loader.getStatus());
        out.flush();
        out.close();
    } else {
        loader = new LoaderThread(lfmaccount);
        loader.start();
        request.getRequestDispatcher("WEB-INF/pages/loader.jsp").forward(
                request, response);
    }
}

@Override
protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    if (lfmaccount.isEmpty()) {
        lfmaccount = request.getSession().getAttribute("lfmUser")
                .toString();
    }
    request.getRequestDispatcher("WEB-INF/pages/loader.jsp").forward(
            request, response);
}
}

jsp使用ajax定期发布到servlet并获取状态。线程只运行了3分钟,最后爬行了一些。调频数据


共 (3) 个答案

  1. # 1 楼答案

    你需要的是Session listener。方法sessionCreated()对于每个浏览器会话只调用一次。因此,即使用户刷新页面,也不会出现问题。 然后,您可以继续为每个sessionCreated()方法调用启动线程

  2. # 2 楼答案

    实现javax。servlet。SingleThreadModel=>;服务方法将不会同时执行。 请参阅servlets规范

  3. # 3 楼答案

    您的第一个任务是找出如何唯一地识别用户,例如,您如何识别代理/SOHO网关后面的不同用户

    一旦你做到了这一点,基本上就是让一个单例对象为用户服务<->;线程映射到servlet

    然后我们进入@beny23在上面的评论中提到的可伸缩性问题。。。我完全同意你提出的观点——你的方法听起来不明智

    干杯