我的下面的方法将从后台线程每隔一分钟调用一次。
在我的下面的代码中,如果我的unauthorizedCount
不等于零,那么我会发送一封电子邮件。
private void callMetrics() {
// .. some other code
// send an email for unauthorized count
if (Integer.parseInt(unauthorizedCount) != 0) {
// send an email here
}
}
现在,如果我的unauthorizedCount
非零,那么至少一小时就会非零,所以这意味着,它将继续每1分钟发送一封电子邮件一小时,这样我们的电子邮件便会被充斥用thiis电子邮件和那些我不想要的东西。
现在我想要做的是 - 只要unauthorizedCount
非零,那么它会发出第一封电子邮件但我不想在下一分钟发送另一封电子邮件作为我的背景线程每1分钟运行一次,我想在半小时后再发送出去。所以基本上我想发送我的第一封电子邮件,每当unauthorizedCount不为零,但如果在下一分钟再次非零,那么我不想发送另一封电子邮件,如果{{1半小时后非零。
我怎样才能做到这一点?我应该在这里使用一些倍增器吗?
答案 0 :(得分:1)
您可以使用其他变量,例如email_sent,mail_at,并在电子邮件发送代码中设置为true,time_at =当前时间。然后在发送电子邮件之前,检查email_sent和日期时间(mail_at)两件事,如果email_sent为false或当前时间 - time_at是半小时,则发送电子邮件。 以下是未使用指定语言或开发技术编写的代码,但您可以轻松转换为所需的语言。
`
method()
{
time_at=Time.Now();
email_sent=false;
if(time or event occurs)
{
if(!email_sent&&Time.Now-time_at>30*60*1000)//milisecond
{
email_sent=true;time_at=Time.Now;
send_emai();//this is the actual mail sending method
}
}
}
`
答案 1 :(得分:1)
private void callMetrics() {
// .. some other code
// send an email for unauthorized count
long now = new Date().getTime();
if (Integer.parseInt(unauthorizedCount) != 0 && satisfiesSinceLast(now)) {
// send an email here
lastSent = now;
}
}
private void satisfiesSinceLast(long now) {
return lastSent == -1 || now - lastSent > 30*60*1000;
}
将lastSent
保留为该类的成员,使用-1
初始化(开头没有发送任何内容)并在每次发送时更新。然后,当您检查条件时,请检查自上次电子邮件以来是否已经过了30分钟(30 * 60 * 1000)。