如何在特定日期和时间触发java中的事件?

时间:2017-04-08 03:36:59

标签: java crontrigger

我需要在特定日期和时间将短信发送给少数移动设备。例如我将列出日期和时间以及相应的移动设备列表。如下。

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

我可以运行一个可以继续检查时间的工作,然后如果当前时间与上面列表中的时间匹配,则发送短信。

但在这种情况下,我将不得不继续检查。

有什么办法,我可以在给定时间直接发射这些事件/短信。比如为每个日期时间注册工作并在那时解雇工作而不是连续运行工作来检查日期时间?

4 个答案:

答案 0 :(得分:2)

您可以使用ScheduledExecutorService。请参阅Tutorial

 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);
}

答案 1 :(得分:0)

使用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,java.util.Date)

timer.schedule(new DateTimeTask(), date);

这种方法的缺点是它创建了多个TimerTask的列表。因此,性能取决于您要安排的任务数量。

答案 2 :(得分:0)

如何使用每次注册的回调方法实现某种形式的自定义事件处理程序。从您的工作中,您可以在每个事件的计时器到达时启动每个回调方法。

答案 3 :(得分:0)

使用java.time

使用Answer by TulupovScheduledExecutorService是正确的,应该被接受。在这里,我解决了日期 - 时间角度。

如果可能,请使用标准ISO 8601格式将日期时间值序列化为文本。

  

2017-04-10T09:00:00Z

     

2017-04-10T11:00:00Z

     

2017-04-11T15:30:00Z

在解析和生成日期时间值时,java.time类默认使用ISO 8601格式。

Instant instant = Instant.parse( "2017-04-10T09:00:00Z" );

此外,您忽略了时区的关键问题。我上面的字符串上的ZZulu的缩写,表示UTC。 Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

如果您必须使用这些不幸格式的字符串,请搜索DateTimeFormatter类的Stack Overflow以了解有关解析字符串的更多信息。

如果您的日期时间适用于其他某个地区的wall-clock time,请通过ZoneId指定时区以获得ZonedDateTime。搜索Stack Overflow以获取更多信息。

您需要花费几毫秒的时间来安排ScheduledExecutorService的活动。您必须计算当前时刻与事件所需Instant之间的毫秒数。这样的时间跨度由Duration类表示为总秒数加上以纳秒为单位的小数秒。您可以将Duration的总时间范围视为毫秒计数(截断任何微秒/纳秒)。

Instant now = Instant.now() ;
Duration d = Duration.of( now , instant ) ;
long millis = d.toMillis();

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore