我用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
。
答案 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
方法。
Object.equals
和Object.hashCode
,了解如何正确覆盖它们。然后:
...
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.equals
和Result.hashCode
。
答案 2 :(得分:0)
答案 3 :(得分:0)
这可能与你的问题略有不同,但我不禁提到你做了两次相同的事情,两次for循环。如果我理解正确,您需要确保没有重复项(如ActiveProcesses
和Inactive Processes
中存在的条目)。如果是这样的话,为什么在向列表中添加条目时不检查重复项?
至于计时器,我必须同意以前的答案:java.util.Timer很可能是你需要的。从那里开始:)
祝你好运编辑:为了将来参考,请尝试指定您的“问题”在主题上