我需要发送短信到少数移动nos在特定的日期和时间。我将有一个日期和时间的清单和相应的移动号码列表。如下所示。
Date Mobile
10th April 9 AM 1234567890
10th April 11 AM 9987123456,9987123457
11th April 3.30 PM 9987123456诸若此类。
我知道,java有cron调度程序,可以按特定的时间表运行。
http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html
我可以运行一个作业,它可以继续检查时间,然后如果当前时间与上面列表中的时间相匹配,发送短信。
但在这种情况下,我将不得不一直检查。
有没有办法,我可以直接在给定的时间发射那些事件/短信。比如为每个日期时间注册作业,并在那个时候触发这些作业,而不是让一个作业连续运行以检查日期时间?
发布于 2017-04-08 04:17:34
您可以使用ScheduledExecutorService。见教程。
private class SmsSenderTask implement Runnable {
private String text;
private List<String> phoneNumbers;
public void run() {
for (String number : phoneNUmbers) {
sendSms(number, text);
}
}
}
ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
for (Date d : dates) {
long millis = d.getTime() - System.currentTimeMillis();
service.schedule(new SmsSenderTask(text, phoneNumbers), millis, TimeUnit.MILLISECONDS);
}发布于 2017-04-09 03:08:35
使用java.time
使用Tulupov的答复的ScheduledExecutorService是正确的,应该被接受。这里我讨论日期-时间的角度。
如果可能,将日期时间值序列化为使用标准ISO 8601格式的文本.
2017-04-10 T09:00:00 Z 2017-04-10 T11:00:00 Z 2017-04-11 T15:30:00 Z
java.time类在解析和生成日期时间值时默认使用ISO 8601格式。
Instant instant = Instant.parse( "2017-04-10T09:00:00Z" );此外,您也忽略了时区这一关键问题。上面字符串上的Z是Zulu和mean的缩写。Instant类以UTC表示时间线上的一个时刻,分辨率为纳秒 (小数的9 (9)位)。
如果必须使用这些不幸格式的字符串,请搜索堆栈溢出,以便DateTimeFormatter类了解有关字符串解析的更多信息。
如果您的约会时间是针对其他地区的挂钟时间的,那么通过ZoneId分配一个时区以获得ZonedDateTime。搜索堆栈溢出,以便了解更多的类名。
您需要获得几毫秒的时间来用ScheduledExecutorService来调度事件。您必须计算当前时刻与所需事件的Instant之间的毫秒数。这样的时间跨度由Duration类表示为总秒数加上以纳秒为单位的分数秒。您可以要求Duration的总时间跨度为毫秒(截断任何微秒/纳秒)。
Instant now = Instant.now() ;
Duration d = Duration.of( now , instant ) ;
long millis = d.toMillis();关于java.time
java.time框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.Date、Calendar和SimpleDateFormat。
尤达-时间项目现在在维护模式中,建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310。
在哪里获得java.time类?
三次-额外项目使用其他类扩展java.time。这个项目是将来可能加入java.time的试验场。您可以在这里找到一些有用的类,如Interval、YearWeek、YearQuarter和更多。
发布于 2017-04-08 03:42:46
使用Java Timer类在特定时间调度事件。
http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html#schedule(java.util.TimerTask
timer.schedule(new DateTimeTask(), date);这种方法的缺点是它创建了多个TimerTask的列表。因此,性能取决于要调度的任务的数量。
https://stackoverflow.com/questions/43289895
复制相似问题