2014-10-01 2 views
0

У меня есть отличный скрипт, который запускается как услуга каждые 1 минуту. Хорошая услуга работает правильно.Groovy - Рассчитайте, пропущены ли определенные минуты с текущего времени.

В этом заводной сценарии мы имеем на сегодняшний день-поля времени named- Shutdown Start Time и Shutdown End Time билет. Я хочу вызвать электронное письмо после 120 минут (2 часа) Время пуска при запуске до текущего времени меньше Время окончания выключения, которое является будущей датой.

Ниже приведен скрипт groovy для получения прошедших минут между текущим временем и временем выключения. Тем не менее, я не могу понять, как я могу проверить, прошли ли истекшие минуты в кратчайшие 120 минут.

import java.util.Date 
import groovy.time.* 
import java.util.* 
import java.util.concurrent.TimeUnit 
import java.util.Calendar 

CustomFieldManager customFieldManager = componentManager.getCustomFieldManager() 
CustomField downTimeStart = customFieldManager.getCustomFieldObjectByName("Shutdown Start Time") 
CustomField downTimeEnd = customFieldManager.getCustomFieldObjectByName("Shutdown End Time") 

Date downTimeStartCFDate = (Date)issue.getCustomFieldValue(downTimeStart) //Get the Shutdown Start Time 
Date downTimeEndCFDate = (Date)issue.getCustomFieldValue(downTimeEnd) //Get the Shutdown End Time 

//Get elapsed time between the current time and the Shutdown Start Time  
TimeDuration startDuration = TimeCategory.minus(new Date(), downTimeStartCFDate) 
long downtimeStartElapsedMinutes =TimeUnit.MILLISECONDS.toMinutes(startDuration.toMilliseconds()) 

//Get elapsed time between the current time and the Shutdown End Time     
TimeDuration endDuration = TimeCategory.minus(downTimeEndCFDate, downTimeStartCFDate) 
long downtimeEndRemaniningMinutes = TimeUnit.MILLISECONDS.toMinutes(endDuration.toMilliseconds()) 

//This sample 'if' condition checks if 12 minutes are elapsed. 
if(downtimeStartElapsedMinutes % 3 == 0 && downtimeStartElapsedMinutes % 4 == 0) 
{ 
    //Send an email 
} 

Вышеупомянутый строгий скрипт реализован как услуга, которая запускается через каждую минуту. В этом рискованном сценарии мне просто нужно проверить, прошло ли время между текущим временем и Время начала выключения составляет 120 минут (2 часа) до будущего Время окончания вылета.

То есть, скажем, -

время простоя Пуск - 2014-10-06 23: 00: 00.0
Конец простоя - 2014-10-07 18: 51: 00,0

Затем . Роскошная услуга, которая будет запускаться через каждые 1 минуту, должна запускать электронные письма каждые два часа с даты начала простоя до истечения времени простоя. Дата-время прибытия -

Простои Start - 2014-10-06 23: 00: 00,0

первый Email Sent - 2014-10-07 01: 00: 00,0

второй Email Sent - 2014-10-07 3:00: 00,0

третьего Email Sent - 2014-10-07 05: 00: 00,0

четвёртой Email Sent - 2014-10-07 07: 00: 00,0

пятых Email Sent - 2014-10-07 09: 00: 00.0

6t ч Email Sent - 2014-10-07 11: 00: 00,0

седьмой Email Sent - 2014-10-07 13: 00: 00,0

восьмой Email Sent - 2014-10-07 15: 00: 00,0

девятым Email Sent - 2014-10-07 17: 00: 00,0

Простои End - 2014-10-07 18: 51: 00,0

было бы очень полезно, если кто-то может делиться вложенными материалами на этом, поскольку я не знаком с хорошими скриптами.

+0

поэтому вы хотите отправить электронное письмо каждые 2 часа до конца времени? – evanwong

ответ

1

Не слишком ли это сложно?

final long TWO_HOURS_MILIS = 2 * 60 * 60 * 1000l 

Date downTimeStartCFDate = (Date)issue.getCustomFieldValue(downTimeStart) 
Date downTimeEndCFDate = (Date)issue.getCustomFieldValue(downTimeEnd) 
long now = System.currentTimeMillis() 
long delta = now - downTimeStartCFDate.time 

// fire between 1:59 and 2:00 
if(delta % TWO_HOURS_MILIS >= TWO_HOURS_MILLIS - 60000 && now < downTimeEndCFDate.time){ 
    sendEmail() 
} 
+0

Спасибо @ injecteer. Но я верю, что здесь, в блоке if, электронное письмо будет инициировано только в первый раз, когда прошло 2 часа после начала простоя. Этот процесс запуска электронной почты должен быть инкрементным, который будет отправлять по электронной почте ** через каждые 2 часа ** с момента простоя до тех пор, пока не будет достигнуто время окончания времени окончания. – Naren

+0

см. Обновление ... – injecteer

+1

Я думаю, что ваши приведения к '(Date)' излишни. Это приведение происходит автоматически, поскольку переменные имеют статический статический тип 'Date'. –