假设我们有一个数据库表(一个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);
}
}
我想你可能想要的是一个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线程。