Java ScheduledExecutorService不显示变量中的更改

Java ScheduledExecutorService不显示变量中的更改,java,servlets,scheduledexecutorservice,Java,Servlets,Scheduledexecutorservice,我一直试图在我的Javaservlet中以1秒的延迟执行一段代码。我需要检查跟踪是开还是关。如果已关闭,则转到“其他”并关闭调度程序。代码如下所示 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub Map m=request

我一直试图在我的Javaservlet中以1秒的延迟执行一段代码。我需要检查跟踪是开还是关。如果已关闭,则转到“其他”并关闭调度程序。代码如下所示

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);
}
protectedvoiddopost(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
//TODO自动生成的方法存根
Map m=request.getParameterMap();
Set s=m.entrySet();
迭代器it=s.Iterator();
int指数=0;
while(it.hasNext()){
Map.Entry=(Map.Entry)it.next();
String key=entry.getKey();
String[]value=entry.getValue();
System.out.println(“值为”+值[0].toString());
开关(钥匙)
{
“RegId”案:
RegId=值[0]。toString();
打破
案例“isTrackingRequested”:
isTrackingRequested=Boolean.valueOf(值[0]);
打破
}
}
布尔值isTrackingRequestednew=isTrackingRequested;
ScheduledExecutorService=Executors.newSingleThreadScheduledExecutor();
ses.scheduleAtFixedRate(新的Runnable(){
@凌驾
public void run(){
//要运行的代码
如果(isTrackingRequestednew){
试一试{
System.out.println(“================================================================================================================”);
System.out.println(“新曲目状态为”+isTrackingRequestednew);
System.out.println(“================================================================================================================”);
}捕获(例外e)
{   
} 
}
其他的
{
ses.shutdown();
}
} 
},0,1,时间单位为秒);
}

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

此代码无法编译,您无法访问内部类中的局部(非最终)变量。
每次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,或者您可以在控制器类中使用一些映射变量(而不是方法局部变量)并存储跟踪id和与其关联的
跟踪信息
我的意思是,如果你的跟踪线程的真正终止和发布的代码一样简单

else {
    ses.shutdown();
}
您根本不需要
跟踪信息。只需存储(如上所述的会话或缓存中)对调度程序的引用,然后在
doPost
方法中收到
isTrackingRequestednew
的值为false时,获取此调度程序并按如下方式关闭它

if (!isTrackingRequestednew) {
    ScheduledExecutorService scheduler = (ScheduledExecutorService) request.getSession().getAttribute("trackingScheduler");
    if (scheduler != null) {
        scheduler.shutdown();
    }
}
您可以使用一些跟踪id作为标识符,并将其与每个请求一起发送

请注意,您还必须清理由于某些网络错误或其他原因未正确关闭的旧调度程序。

此代码不会编译,您无法访问内部类中的本地(非最终)变量。
每次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,或者您可以在控制器类中使用一些映射变量(而不是方法局部变量)并存储跟踪id和与其关联的
跟踪信息
我的意思是,如果你的跟踪线程的真正终止和发布的代码一样简单

else {
    ses.shutdown();
}
您根本不需要
跟踪信息。只需存储(如上所述的会话或缓存中)对调度程序的引用,然后在
doPost
方法中收到
isTrackingRequestednew
的值为false时,获取此调度程序并按如下方式关闭它

if (!isTrackingRequestednew) {
    ScheduledExecutorService scheduler = (ScheduledExecutorService) request.getSession().getAttribute("trackingScheduler");
    if (scheduler != null) {
        scheduler.shutdown();
    }
}
您可以使用一些跟踪id作为标识符,并将其与每个请求一起发送

请注意,您还必须清理由于某些网络错误或其他原因未正确关闭的旧调度程序。

此标志是此方法的本地标志,因此,它将随每个请求而更改。另外,我认为调度/停止任务的逻辑应该在单独的类中,而不是在servlet中,并且应该由实例变量控制。@Darshan Mehta如果我创建实例变量并将任务委托给某个类方法,它将为每个请求形成新的对象(一个用于打开,另一个用于关闭)。我需要为同一个用户处理关闭功能,如果每次创建对象并委派,这是不可能的。我希望你明白我的意思。@DarshanMehta我也有同样的想法,但变量的值不变。你能分享完整的代码吗?我们在哪里声明了“isTrackingRequested”标志?@DarshanMehta isTrackingRequested的值来自移动应用程序,非常准确。标志isTrackingRequested显示更改,但变量isTrackingRequestednew不显示。该标志是此方法的本地标志,因此它将在