1

我正在使用 Apache Tomcat 7.0.39、Eclipse Java EE Juno、Java JRE 7 和 Java JDK 1.7.0_13。

我的计时器有问题。我有两个功能,第一个启动计时器并执行任务,另一个停止计时器。但是计时器永远不会停止,因为它是空的。

我的 Java 代码:

public class TestXMLSQLTimerLocal
{
    public Timer timer;

    public TestXMLSQLTimerLocal()
    {

    }

    public void start()
    {
        this.timer = new Timer();
        TimerTask task = new TimerTask()
        {
            public void run()
            {
            //Some code
            }
        };

        timer.scheduleAtFixedRate(task, 0, 60000);
    }
    public void stop() {
        this.timer.cancel();
    }
}

我的 JSP 页面:

<%@page import="com.accenture.api.TestXMLSQLTimerLocal" %>
<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%
String text = "Press the Start button to begin !";
String action = request.getParameter("action");
TestXMLSQLTimerLocal TM = new TestXMLSQLTimerLocal();
if ("Start".equals(action))
{
    TM.start();
    text = "The data are being transferred. Press the Stop button when you want to stop the transfer !";
}
if("Stop".equals(action))
{
    TM.stop();
    text = "The transfer is stopped. Press the Start button to begin the transfer again !";
}
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Transfer Module</title>
</head>
<body>
    <form name="StartTM" action="#">
        <input type="hidden" name="action" value="Start"/>
        <input type="submit" value="Start"/>
    </form>
    <br />
    <p><%=text%></p>
    <br />
    <form name="StopTM" action="#">
        <input type="hidden" name="action" value="Stop"/>
        <input type="submit" value="Stop"/>
    </form>
</body>
</html>

start() 和 stop() 由简单 JSP 页面上的 Start 和 Stop 按钮调用。

对我来说,问题是计时器仍然为空,因为 Start() 方法中的修改没有考虑在内。有人可以帮助我吗?如果您需要更多信息,请询问我

4

4 回答 4

1

在构造函数中启动计时器,而不是 start 方法:

public class TestXMLSQLTimerLocal
{
public Timer timer;    

public TestXMLSQLTimerLocal(){
   this.timer = new Timer();
}

public void start()
{
    TimerTask task = new TimerTask()
    {
        public void run()
        {
        //Some code
        }
    };

    timer.scheduleAtFixedRate(task, 0, 60000);
}
public void stop() {
    this.timer.cancel();
}
}
于 2013-04-09T09:27:40.997 回答
1

您需要确保在停止命令之前调用您的启动命令。另外,将您this.timer = new Timer();放入类的构造函数中。

于 2013-04-09T09:28:05.943 回答
0

如果您从 JSP 调用它,则该实例TestXMLSQLTimerLocal会产生新线程,并且Timer当用户按下停止按钮时该实例不可用。

您需要将一个实例添加TestXMLSQLTimerLocal到会话中,或者最好是 applicationContext。当您对该实例执行操作时,请始终将其从会话中拉出。

要将实例添加TestXMLSQLTimerLocal到会话:

//From Servlet
request.getSession().addAttribute("timer", new TestXMLSQLTimerLocal());

要将实例添加到应用程序范围,您需要使用ServletContextListener

此外,代码将引发 NPE 错误,因为Timer从未创建过 的实例。

于 2013-04-09T09:29:45.187 回答
0

感谢 Kevin Bowersok,我找到了解决方案

我将“开始”和“停止”按钮分成两页,并通过会话发送我的 TestXMLSQLTimerLocal 对象。

通过会话发送对象:

session.putValue("TM",TM);

要获取其他页面中的值:

TestXMLSQLTimerLocal TM = (TestXMLSQLTimerLocal) session.getValue("TM");

谢谢你们的帮助

于 2013-04-10T07:04:06.100 回答