1

私は Apache Tomcate 7.0.39、Eclipse Java EE Juno、Java JRE 7 & Java JDK 1.7.0_13 を使用しています。

タイマーに問題があります。最初の関数はタイマーを開始してタスクを実行し、もう 1 つはタイマーを停止します。ただし、null であるため、タイマーは停止しません。

私の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() メソッドの変更が考慮されていないため、タイマーがまだ null であることです。誰かが私を助けることができますか?さらに情報が必要な場合は、私に尋ねてください

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

start コマンドが stop コマンドの前に呼び出されていることを確認する必要があります。また、this.timer = new Timer();あなたのクラスのコンストラクターに入れます。

于 2013-04-09T09:28:05.943 に答える
0

Kevin Bowersok のおかげで解決策を見つけました

[開始] ボタンと [停止] ボタンを 2 つのページに分割し、セッションを介して TestXMLSQLTimerLocal オブジェクトを送信します。

session 経由でオブジェクトを送信するには:

session.putValue("TM",TM);

他のページで値を取得するには:

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

みんな助けてくれてありがとう

于 2013-04-10T07:04:06.100 に答える
0

これを JSP から呼び出すと、そのインスタンスがTestXMLSQLTimerLocal新しいスレッドを生成しTimer、ユーザーが停止ボタンを押したときに使用できなくなります。

TestXMLSQLTimerLocalのインスタンスをセッションに追加する必要があります。できれば applicationContext に追加する必要があります。このインスタンスに対して操作を実行するときは、常にセッションからプルします。

TestXMLSQLTimerLocalのインスタンスをセッションに追加するには:

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

インスタンスを Application Scope に追加するには、使用する必要があるServletContextListener

また、 のインスタンスが作成されないため、コードは NPE エラーをスローしますTimer

于 2013-04-09T09:29:45.187 に答える