如何在java中解决这个Timer问题?

时间:2010-07-07 07:26:59

标签: java timer

我用Timer开发java Email应用程序,我有两个名为ActiveProcesses,InActiveProcesses的arraylists。如果我启动计时器,它将每秒发送带有InActiveProcesses列表值的电子邮件。但问题是如果InActiveProcesses列表值相同,则会向计时器发送电子邮件。例如,InActiveProcess列表包含值abcd,它将每秒发送具有相同列表值的电子邮件。我想发送电子邮件只有InActiveProcesses列表包含不同的值。如果值不同,计时器将每秒检查一次值,它将发送电子邮件。如何使用java处理这个问题。提前致谢。这是代码,

for (int i = 0; i < InActiveProcess.size(); i++)
{
    if (!ActiveProcess.contains(InActiveProcess.get(i)))
    {
        list3.add(InActiveProcess.get(i));
    }
}
for (int i = 0; i < ActiveProcess.size(); i++)
{
    if (!InActiveProcess.contains(ActiveProcess.get(i)))
    {
        list3.add(ActiveProcess.get(i));
    }
}
log.info("Processes which are Not Running: " + list3);

StringBuilder sb = new StringBuilder();

for (int k = 0; k < list3.size(); k++)
{

    Result = list3.get(k);

    sb.append(Result.toString());

    sb.append(" ");

}

String message = sb.toString();

log.info(message);

sms.SendMessage("1254554555", message);

es.SendMail("abcdr@gmail.com", " Server process is down", message);

这是我的Timer课程。

int delay = 5000; // delay for 5 sec.

int interval = 1000; // iterate every sec.

Timer timer = new Timer();

        timer.scheduleAtFixedRate(new sample() {

        }, delay, interval);

定时器为每秒执行sample()类,并将电子邮件发送到指定的地址。我想同时处理Timer会执行的每一秒,如果es.SendMail("abcdr@gmail.com", " Server process is down", message);包含的值不同,则会发送电子邮件message

4 个答案:

答案 0 :(得分:2)

更新:发布此答案后问题已更改。这是原始问题的答案:

您可以使用Timer课程。

您可以安排通过TimerTask关闭计时器时要采取的操作。这个类是抽象的,所以你必须扩展它并实现方法run()

class MyTimerTask extends TimerTask {

   @Override
   public void run(){
   // Task to do here
 }
}

然后在你的主要班级

MyTimerTask task = new MyTimerTask(); // this class implements WHAT to do inside the method run();
Date date = new Date(...) // This class will tell timer WHEN to do the task
Timer timer = new Timer(task,date); //Good to go!

或者,您可以执行Timer timer = new Timer(task,delay)以在delay毫秒之后执行任务

答案 1 :(得分:1)

我的假设:

  • list3是指java.util.List.
  • 的一个实例
  • 您可以修改Result类。

首先,在Object.equals课程中覆盖Result方法。

然后:

...

log.info("Processes which are Not Running: " + list3);
if (!list3.equals(this.previousList)) {
    // update history for next time
    this.previousList.clear();
    this.previousList.addAll(list3);

    // Prepare and send email
    StringBuilder sb = new StringBuilder();
    for (int k = 0; k < list3.size(); k++)
    {
        Result = list3.get(k);
        sb.append(Result.toString());
        sb.append(" ");
        String message = sb.toString();
        log.info(message);
        sms.SendMessage("1254554555", message);
        es.SendMail("abcdr@gmail.com", " Server process is down", sb);
    }
}

列表中进程的顺序是否重要?例如,列表“a-b-c-d”和“b-a-d-c”是否不同?如果答案是否定的,则java.util.List.equals将无法满足您的需求。在这种情况下,不要使用列表,而是设置。


编辑:

如果保证列表一致排序(如果'abcd'永远不会'bad-c'),可能可以(并且更便宜)构建,保存和比较字符串从StringBuilder创建,而不是构建,保存和比较列表。这样,您就不必实现Result.equalsResult.hashCode

答案 2 :(得分:0)

答案 3 :(得分:0)

这可能与你的问题略有不同,但我不禁提到你做了两次相同的事情,两次for循环。如果我理解正确,您需要确保没有重复项(如ActiveProcessesInactive Processes中存在的条目)。如果是这样的话,为什么在向列表中添加条目时不检查重复项?

至于计时器,我必须同意以前的答案:java.util.Timer很可能是你需要的。从那里开始:)

祝你好运

编辑:为了将来参考,请尝试指定您的“问题”在主题上