ScheduledExecutorService不显示变量的变化

时间:2015-12-23 09:45:51

标签: java servlets scheduledexecutorservice

我一直在尝试在java servlet中执行延迟1秒的代码。如果跟踪开启或关闭,我需要检查条件。如果它关闭则转到else并关闭调度程序。代码如下。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub

    Map m=request.getParameterMap();
    Set s = m.entrySet();
    Iterator it = s.iterator();
    int index=0;

        while(it.hasNext()){

            Map.Entry<String,String[]> entry = (Map.Entry<String,String[]>)it.next();

            String key             = entry.getKey();
            String[] value         = entry.getValue();

            System.out.println("Value is "+value[0].toString());
                     switch(key)
                     {
                     case "RegId": 
                         RegId=value[0].toString();
                         break;
                     case "isTrackingRequested": 
                         isTrackingRequested=Boolean.valueOf(value[0]);
                         break;     
         }
     }
    boolean isTrackingRequestednew=isTrackingRequested;
    ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();

        ses.scheduleAtFixedRate(new Runnable() {
            @Override 
            public void run() { 

                // code to run 
                if(isTrackingRequestednew){
                    try {
                        System.out.println("===========================================================================");
                        System.out.println("new track status is "+isTrackingRequestednew);
                        System.out.println("===========================================================================");

                        }catch(Exception e)
                        {   

                        } 
                     }
                else
                {
                    ses.shutdown();

                }
            } 
        }, 0, 1, TimeUnit.SECONDS);
}

现在为了停止跟踪我的应用程序将isTrackingRequestednew发送为“false”,现在这个值根本没有改变。我不知道为什么会这样。请帮帮我。

1 个答案:

答案 0 :(得分:0)

此代码无法编译,您无法访问内部类中的本地(非最终)变量 每次在post请求时,您都会创建新的ExecutorService,而不是每个会话或跟踪实体创建一次。我不知道这个帖子的目的是什么,所以我会保存你奇怪的代码风格

private static class TrackingInfo {
    final private AtomicBoolean status;
    final private ScheduledExecutorService ses;

    TrackingInfo(boolean flagStatus) {
        this.status = new AtomicBoolean(flagStatus);
        this.ses = Executors.newSingleThreadScheduledExecutor();
        ses.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {

                // code to run
                if (status.get()) {
                    try {
                        System.out.println("===========================================================================");
                        System.out.println("new track status is " + status.get());
                        System.out.println("===========================================================================");

                    } catch (Exception e) {

                }
                } else {
                    ses.shutdown();
                }
            }
        }, 0, 1, TimeUnit.SECONDS);
    }

    public void setStatus(boolean status) {
        this.status.set(status);
    }
}

使用request.getSession().getAttribute(...) / setAttribute()将此TrackingInfo和worker保存在其中并通过TrackingInfo.setStatus(newStatus)实例将标志更改传递给worker,或者您可以在控制器类中使用一些Map变量(不是方法局部变量)和存储跟踪ID和与之关联的TrackingInfo
Imho,如果您真正终止跟踪线程就像在发布的代码中一样简单

else {
    ses.shutdown();
}

根本不需要TrackingInfo。只需存储(在上面描述的会话或缓存中)对调度程序的引用,而不是在isTrackingRequestednew方法中收到带有错误值的doPost,获取此调度程序并将其关闭为此

if (!isTrackingRequestednew) {
    ScheduledExecutorService scheduler = (ScheduledExecutorService) request.getSession().getAttribute("trackingScheduler");
    if (scheduler != null) {
        scheduler.shutdown();
    }
}

相反"trackingScheduler"您可以使用一些跟踪ID作为标识符,并将其与每个请求一起发送。
请注意,您还必须清除由于某些网络错误或其他原因未正确关闭的旧调度程序。