根据数据库列中传递的日期调用Java方法

问题描述 投票:0回答:1

假设我们有一个数据库表(一个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);
    }
}
java database spring
1个回答
0
投票

我想你可能想要的是一个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线程。

© www.soinside.com 2019 - 2024. All rights reserved.