林发展与定时器的Java电子邮件应用程序中,我有一个名为ActiveProcesses,InActiveProcesses两分的ArrayLists。 如果我启动定时器就会发送电子邮件每秒钟InActiveProcesses列表值。 但问题是计时器要发送的电子邮件,如果InActiveProcesses列表值是same.For例的InActiveProcess列表包含值abcd
,它会发送电子邮件every秒同一个列表值。 我想只发送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()
类为每秒钟发送电子邮件到指定的地址。 我要处理的计时器将在同一时间,每秒执行,电子邮件被发送es.SendMail("abcdr@gmail.com", " Server process is down", message);
如果message
包含的值是不同的。
更新 :发布这个答案后改变的问题。 这就是答案,原来的问题:
您可以使用定时器类。
您可以安排当计时器关闭通过采取行动的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
毫秒
我的假设:
-
list3
是指的一个实例java.util.List.
- 您可以修改
Result
类。
首先,重写Object.equals
在你的方法Result
类。
- 咨询Java标准平台API文档 ; 阅读
Object.equals
和Object.hashCode
了解如何正确地覆盖它们。 - 这里过去的讨论可能会有所帮助:
- Java的覆盖对象的equals()方法
- 为什么我们需要重写java中equals和hashCode,为什么我们不能用Object类的实现
然后:
...
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);
}
}
这些进程的列表中的顺序很重要? 例如,在列表“ABCD”和“BADC”有什么不同? 如果答案是否定的,那么java.util.List.equals
不能满足您的需求。 在这种情况下,不要使用名单,但套。
编辑:
如果该列表是保证持续有序的(如果“ABCD”绝不可能“坏-C”),有可能 (更便宜)建立,保存和比较来自StringBuilder的创建的字符串,而不是建筑,节能,并比较列表。 这样你就不会实现Result.equals
和Result.hashCode
无论是。
看看java.util.Timer中或SheduledExecutorServices
这可能是轻微无关你的问题,但我不能帮助提的是,你做几乎同样的事情两次,在两个for循环。 如果我理解正确的话,你要确保有没有重复(如存在于两个入口ActiveProcesses
和Inactive Processes
)。 如果是这样的话,为什么不重复检查,当您添加到列表中的条目?
至于定时器,我会和以前的答案一致:java.util.Timer中最有可能是你所需要的。 刚开始时有:)
祝好运
编辑:以供将来参考,请尝试指定你的“问题”是关于这个问题,而不是