【发布时间】:2015-12-23 09:45:51
【问题描述】:
我一直在尝试在我的 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”,现在这个值根本没有改变。我不知道为什么会这样。请帮帮我。
【问题讨论】:
-
该标志是该方法的本地标志,因此,它会随着每个请求而改变。另外,我认为调度/停止任务的逻辑应该在一个单独的类中而不是在 servlet 中,并且应该由一个实例变量控制。
-
@Darshan Mehta 如果我创建实例变量并将任务委托给某个类方法,它将为每个请求形成新对象(一个用于“打开”,另一个用于“关闭”)。我需要为同一用户处理关闭功能,如果我每次都创建对象并委托,这是不可能的。我希望你明白我的意思。
-
@DarshanMehta 我也有同样的想法,但变量的值没有改变。
-
你能分享完整的代码吗?我们在哪里声明了“isTrackingRequested”标志?
-
@DarshanMehta isTrackingRequested 的值来自移动应用程序并且非常准确。标志 isTrackingRequested 显示更改,但变量 isTrackingRequestednew 没有。
标签: java servlets scheduledexecutorservice