Вызов метода Java на основе передачи даты в столбце базы данных - PullRequest
0 голосов
/ 02 июля 2018

Предположим, у нас есть таблица базы данных (сущность JPA), которая создается следующим образом

id|start_date         |end_date           |object_id
1 |2018-01-01 00:00:00|2018-07-01 20:00:00|1

Я хотел бы запустить определенный метод, когда end_date передает current_date () - и я хочу, чтобы Spring / Java / DB запускал этот метод без использования планировщиков. Некоторый псевдокод ниже:

when (end_date <= current_date()) -> myClass.executeMyMethod(object_id)

Это вообще возможно? Я искал много разных сайтов и пока не нашел ответа.

Редактировать - вот сущность, для которой я хотел бы сделать это:

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "time_based_event", schema = "timing")
public class TimePassingByTrigger {

    @Column(name = "id", nullable = false)
    protected Long id;

    @Column(name = "start_date", nullable = false)
    protected LocalDateTime startDate;

    @Column(name = "endDate", nullable = false)
    protected LocalDateTime endDate; 

    @Column(name = "object_id", nullable = false)
    protected Long objectId; 

}

А для сервисного вызова - давайте предположим, что я хотел бы сделать что-то вроде:

public class TimeFiredEvent {

    // this method should be executed for each objectId for
    // which end_date has passed
    public void thisShouldRunOnlyWhenDatePasses(Long objectId) {
        System.out.println("Time has passed for object: " + objectId);
    }
}

1 Ответ

0 голосов
/ 03 июля 2018

Я думаю, что вы можете хотеть это EntityListener

@Table(name="time_based_event", schema="timing")
@EntityListeners(class=TimeFiredEvent.class)
public class TimePassingByTrigger {
....

И вы определяете фактического слушателя

public class TimeFiredEvent {
    @PostPersist
    public void checkTriggerTime(TimePassingByTrigger trig) {
       if(trig.getEndDate().before(new Date()) {
         thisShouldRunOnlyWhenDatePasses(trig.getId());
       }
    }

    public void thisShouldRunOnlyWhenDatePasses(Long objectId) {
    }
}

Однако, это, вероятно, не то, что вам действительно нужно . EntityListener будет выполняться только тогда, когда объект будет сохранен, извлечен или удален. (Допустимые точки обратного вызова: @PrePersist, @PreRemove, @PostPersist, @PostRemove, @PreUpdate, @PostUpdate, @PostLoad)

Но нет механизма для выполнения кода только потому, что время продолжило свой неумолимый шаг вперед. Вам все равно понадобится какой-нибудь механизм опроса или спящий поток Java, если вы хотите выполнить проверку в другое время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...