Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,10 @@
<outputFile>../ui/spt-ui-lib/lib/server-api.ts</outputFile>
<outputKind>module</outputKind>
<outputFileType>implementationFile</outputFileType>
<optionalAnnotations>
<annotation>jakarta.annotation.Nullable</annotation>
<annotation>org.springframework.lang.Nullable</annotation>
</optionalAnnotations>
</configuration>
</plugin>
<plugin>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.event.EventListener;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Service;
Expand All @@ -21,7 +20,9 @@
import org.sterl.spring.persistent_tasks.api.event.TriggerTaskCommand;
import org.sterl.spring.persistent_tasks.history.HistoryService;
import org.sterl.spring.persistent_tasks.history.model.CompletedTriggerEntity;
import org.sterl.spring.persistent_tasks.history.model.HistoryTriggerEntity;
import org.sterl.spring.persistent_tasks.scheduler.SchedulerService;
import org.sterl.spring.persistent_tasks.shared.model.HasTrigger;
import org.sterl.spring.persistent_tasks.shared.model.TriggerEntity;
import org.sterl.spring.persistent_tasks.trigger.TriggerService;
import org.sterl.spring.persistent_tasks.trigger.model.RunningTriggerEntity;
Expand All @@ -47,27 +48,19 @@ public class PersistentTaskService {
* @param key the {@link TriggerKey} to look for
* @return the {@link TriggerEntity} to the {@link TriggerKey}
*/
public Optional<TriggerEntity> getLastTriggerData(TriggerKey key) {
public Optional<HasTrigger> getLastTriggerData(TriggerKey key) {
final Optional<RunningTriggerEntity> trigger = triggerService.get(key);
if (trigger.isEmpty()) {
var history = historyService.findLastKnownStatus(key);
if (history.isPresent()) {
return Optional.ofNullable(history.get().getData());
return Optional.ofNullable(history.get());
}
return Optional.empty();
} else {
return Optional.ofNullable(trigger.get().getData());
return Optional.ofNullable(trigger.get());
}
}

public Optional<TriggerEntity> getLastDetailData(TriggerKey key) {
var data = historyService.findAllDetailsForKey(key, Pageable.ofSize(1));
if (data.isEmpty()) {
return Optional.empty();
}
return Optional.of(data.getContent().get(0).getData());
}

@EventListener
void queue(TriggerTaskCommand<? extends Serializable> event) {
if (event.size() == 1) {
Expand Down Expand Up @@ -167,4 +160,10 @@ public Optional<TriggerEntity> findLastTriggerByCorrelationId(String correlation
}
return result.isEmpty() ? Optional.empty() : Optional.of(result.getFirst());
}

public Optional<HistoryTriggerEntity> getLastTriggerHistory(Long id) {
var result = historyService.findAllDetailsForInstance(id, PageRequest.ofSize(1));
if (result.isEmpty()) return Optional.empty();
return Optional.of(result.getContent().getFirst());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.sterl.spring.persistent_tasks.api;

import java.time.OffsetDateTime;

import org.springframework.lang.Nullable;

import lombok.Data;

@Data
public class HistoryTrigger {

/** just a unique id of this trigger */
private Long id;

private Long instanceId;

/** the business key which is unique it is combination for triggers but not the history! */
private TriggerKey key;

private OffsetDateTime createdTime;

@Nullable
private OffsetDateTime start;

private int executionCount = 0;

private TriggerStatus status;

@Nullable
private String message;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import java.time.OffsetDateTime;

import org.springframework.lang.Nullable;

import lombok.Data;

@Data
Expand All @@ -15,20 +17,26 @@ public class Trigger {
/** the business key which is unique it is combination for triggers but not the history! */
private TriggerKey key;

@Nullable
private String tag;

@Nullable
private String correlationId;

@Nullable
private String runningOn;

private OffsetDateTime createdTime = OffsetDateTime.now();
private OffsetDateTime createdTime;

private OffsetDateTime runAt = OffsetDateTime.now();
private OffsetDateTime runAt;

@Nullable
private OffsetDateTime lastPing;

@Nullable
private OffsetDateTime start;

@Nullable
private OffsetDateTime end;

private int executionCount = 0;
Expand All @@ -38,10 +46,14 @@ public class Trigger {

private TriggerStatus status = TriggerStatus.WAITING;

@Nullable
private Long runningDurationInMs;

@Nullable
private Object state;

@Nullable
private String exceptionName;
@Nullable
private String lastException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,18 @@ public boolean hasValue() {
|| StringHelper.hasValue(tag);
}


public static TriggerSearch byCorrelationId(String correlationId) {
var result = new TriggerSearch();
result.setCorrelationId(correlationId);
return result;
}

public static TriggerSearch byStatus(TriggerStatus status) {
var result = new TriggerSearch();
result.setStatus(status);
return result;
}

public static TriggerSearch forTriggerRequest(TriggerRequest<?> trigger) {
var search = new TriggerSearch();
if (trigger.key() != null) {
Expand All @@ -57,12 +58,12 @@ public static TriggerSearch forTriggerRequest(TriggerRequest<?> trigger) {
public static Sort sortByCreatedTime(Direction direction) {
return Sort.by(direction, "data.createdTime");
}

public static Pageable applyDefaultSortIfNeeded(Pageable page) {
var result = page;
if (page.getSort() == Sort.unsorted()) {
result = PageRequest.of(page.getPageNumber(), page.getPageSize(), DEFAULT_SORT);
}
return result;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.sterl.spring.persistent_tasks.history.model.QCompletedTriggerEntity;
import org.sterl.spring.persistent_tasks.history.repository.CompletedTriggerRepository;
import org.sterl.spring.persistent_tasks.history.repository.TriggerHistoryDetailRepository;
import org.sterl.spring.persistent_tasks.shared.QueryHelper;
import org.sterl.spring.persistent_tasks.shared.model.HasTrigger;
import org.sterl.spring.persistent_tasks.shared.stereotype.TransactionalService;

Expand Down Expand Up @@ -53,9 +54,10 @@ public void deleteAll() {
triggerHistoryDetailRepository.deleteAllInBatch();
}

public void deleteAllOlderThan(OffsetDateTime age) {
completedTriggerRepository.deleteOlderThan(age);
triggerHistoryDetailRepository.deleteOlderThan(age);
public long deleteAllOlderThan(OffsetDateTime age) {
var result = triggerHistoryDetailRepository.deleteOlderThan(age);
result += completedTriggerRepository.deleteOlderThan(age);
return result;
}

/**
Expand All @@ -65,16 +67,9 @@ public long countTriggers(TriggerStatus status) {
return triggerHistoryDetailRepository.countByStatus(status);
}

public List<HistoryTriggerEntity> findAllDetailsForInstance(long instanceId) {
return triggerHistoryDetailRepository.findAllByInstanceId(instanceId);
}

public Page<HistoryTriggerEntity> findAllDetailsForKey(TriggerKey key) {
return findAllDetailsForKey(key, PageRequest.of(0, 100));
}
public Page<HistoryTriggerEntity> findAllDetailsForKey(TriggerKey key, Pageable page) {
page = applyDefaultSortIfNeeded(page);
return triggerHistoryDetailRepository.listKnownStatusFor(key, page);
public Page<HistoryTriggerEntity> findAllDetailsForInstance(long instanceId, Pageable page) {
page = QueryHelper.applySortIfEmpty(page, Sort.by(Direction.DESC, "id"));
return triggerHistoryDetailRepository.findAllByInstanceId(instanceId, page);
}

public Optional<TriggerKey> reQueue(Long id, OffsetDateTime runAt) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ class HistoryTimer {
void deleteOldHistory() {
try {
final var age = OffsetDateTime.now().minus(historyTimeout);
historyService.deleteAllOlderThan(age);
log.debug("Deleted triggers older than {}.", historyTimeout);
var count = historyService.deleteAllOlderThan(age);
log.debug("Deleted history {} older than {}.", count, historyTimeout);
} catch (Exception e) {
log.error("Failed to delete old triggers", e);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package org.sterl.spring.persistent_tasks.history.api;

import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.sterl.spring.persistent_tasks.api.Trigger;
import org.sterl.spring.persistent_tasks.api.HistoryTrigger;
import org.sterl.spring.persistent_tasks.history.model.CompletedTriggerEntity;
import org.sterl.spring.persistent_tasks.history.model.HistoryTriggerEntity;
import org.sterl.spring.persistent_tasks.shared.ExtendetConvert;
Expand All @@ -22,16 +24,23 @@ public Trigger convert(@NonNull CompletedTriggerEntity source) {
}
}

enum FromTriggerStateDetailEntity implements ExtendetConvert<HistoryTriggerEntity, Trigger> {
enum ToHistoryTrigger implements ExtendetConvert<HistoryTriggerEntity, HistoryTrigger> {
INSTANCE;

@NonNull
@Override
public Trigger convert(@NonNull HistoryTriggerEntity source) {
var result = ToTrigger.INSTANCE.convert(source);
@Nullable
public HistoryTrigger convert(@NonNull HistoryTriggerEntity source) {
var result = new HistoryTrigger();
result.setCreatedTime(source.getCreatedTime());
result.setExecutionCount(source.getExecutionCount());
result.setId(source.getId());
result.setInstanceId(source.getInstanceId());
result.setKey(source.getKey());
result.setMessage(source.getMessage());
result.setStart(source.getStart());
result.setStatus(source.getStatus());
return result;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@
import org.sterl.spring.persistent_tasks.api.TaskStatusHistoryOverview;
import org.sterl.spring.persistent_tasks.api.Trigger;
import org.sterl.spring.persistent_tasks.api.TriggerGroup;
import org.sterl.spring.persistent_tasks.api.HistoryTrigger;
import org.sterl.spring.persistent_tasks.api.TriggerKey;
import org.sterl.spring.persistent_tasks.api.TriggerSearch;
import org.sterl.spring.persistent_tasks.history.HistoryService;
import org.sterl.spring.persistent_tasks.history.api.HistoryConverter.FromLastTriggerStateEntity;
import org.sterl.spring.persistent_tasks.history.api.HistoryConverter.FromTriggerStateDetailEntity;
import org.sterl.spring.persistent_tasks.history.api.HistoryConverter.ToHistoryTrigger;

import lombok.RequiredArgsConstructor;

Expand All @@ -32,9 +33,11 @@ public class TriggerHistoryResource {
private final HistoryService historyService;

@GetMapping("history/instance/{instanceId}")
public List<Trigger> listInstances(@PathVariable("instanceId") long instanceId) {
return FromTriggerStateDetailEntity.INSTANCE.convert( //
historyService.findAllDetailsForInstance(instanceId));
public PagedModel<HistoryTrigger> listInstances(
@PathVariable("instanceId") long instanceId,
@PageableDefault(size = 250) Pageable page) {

return ToHistoryTrigger.INSTANCE.toPage(historyService.findAllDetailsForInstance(instanceId, page));
}
@GetMapping("task-status-history")
public List<TaskStatusHistoryOverview> taskStatusHistory() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.sterl.spring.persistent_tasks.history.component;

import java.time.OffsetDateTime;

import org.apache.commons.lang3.StringUtils;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
Expand Down Expand Up @@ -64,11 +63,16 @@ public void execute(final long triggerId, final TriggerEntity data, boolean isDo
}

var detail = new HistoryTriggerEntity();
detail.setExecutionCount(data.getExecutionCount());
detail.setInstanceId(triggerId);
detail.setData(data.toBuilder()
.state(null)
.createdTime(OffsetDateTime.now())
.build());
detail.setKey(data.getKey());

var msg = data.getExceptionName();
if (data.getLastException() != null) msg = data.getLastException();
detail.setMessage(StringUtils.substring(msg, 0, 200));

detail.setStart(data.getStart());
detail.setStatus(data.getStatus());
triggerHistoryDetailRepository.save(detail);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@

@Entity
@Table(name = "pt_completed_triggers", indexes = {
@Index(name = "idx_pt_trigger_history_last_states_task_name", columnList = "task_name"),
@Index(name = "idx_pt_trigger_history_last_states_trigger_id", columnList = "trigger_id"),
@Index(name = "idx_pt_trigger_history_last_states_status", columnList = "status"),
@Index(name = "idx_pt_trigger_history_last_states_created_time", columnList = "created_time"),
@Index(name = "idx_pt_trigger_history_last_states_correlation_id", columnList = "correlation_id"),
@Index(name = "idx_pt_trigger_history_last_states_tag", columnList = "tag"),
@Index(name = "idx_pt_completed_triggers_task_name", columnList = "task_name"),
@Index(name = "idx_pt_completed_triggers_trigger_id", columnList = "trigger_id"),
@Index(name = "idx_pt_completed_triggers_status", columnList = "status"),
@Index(name = "idx_pt_completed_triggers_created_time", columnList = "created_time"),
@Index(name = "idx_pt_completed_triggers_correlation_id", columnList = "correlation_id"),
@Index(name = "idx_pt_completed_triggers_tag", columnList = "tag"),
})
@Data
@NoArgsConstructor
Expand Down
Loading