Skip to content

Commit de65112

Browse files
authored
Smaller history (#16)
* removed some indexes which aren't used * ensure only running triggers are select to be abandon * fixed name in the entity * reduced history to a simpler table
1 parent 1ef67ae commit de65112

File tree

54 files changed

+549
-336
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+549
-336
lines changed

core/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,10 @@
156156
<outputFile>../ui/spt-ui-lib/lib/server-api.ts</outputFile>
157157
<outputKind>module</outputKind>
158158
<outputFileType>implementationFile</outputFileType>
159+
<optionalAnnotations>
160+
<annotation>jakarta.annotation.Nullable</annotation>
161+
<annotation>org.springframework.lang.Nullable</annotation>
162+
</optionalAnnotations>
159163
</configuration>
160164
</plugin>
161165
<plugin>

core/src/main/java/org/sterl/spring/persistent_tasks/PersistentTaskService.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import org.apache.commons.lang3.StringUtils;
1111
import org.springframework.context.event.EventListener;
1212
import org.springframework.data.domain.PageRequest;
13-
import org.springframework.data.domain.Pageable;
1413
import org.springframework.data.domain.Sort.Direction;
1514
import org.springframework.lang.NonNull;
1615
import org.springframework.stereotype.Service;
@@ -21,7 +20,9 @@
2120
import org.sterl.spring.persistent_tasks.api.event.TriggerTaskCommand;
2221
import org.sterl.spring.persistent_tasks.history.HistoryService;
2322
import org.sterl.spring.persistent_tasks.history.model.CompletedTriggerEntity;
23+
import org.sterl.spring.persistent_tasks.history.model.HistoryTriggerEntity;
2424
import org.sterl.spring.persistent_tasks.scheduler.SchedulerService;
25+
import org.sterl.spring.persistent_tasks.shared.model.HasTrigger;
2526
import org.sterl.spring.persistent_tasks.shared.model.TriggerEntity;
2627
import org.sterl.spring.persistent_tasks.trigger.TriggerService;
2728
import org.sterl.spring.persistent_tasks.trigger.model.RunningTriggerEntity;
@@ -47,27 +48,19 @@ public class PersistentTaskService {
4748
* @param key the {@link TriggerKey} to look for
4849
* @return the {@link TriggerEntity} to the {@link TriggerKey}
4950
*/
50-
public Optional<TriggerEntity> getLastTriggerData(TriggerKey key) {
51+
public Optional<HasTrigger> getLastTriggerData(TriggerKey key) {
5152
final Optional<RunningTriggerEntity> trigger = triggerService.get(key);
5253
if (trigger.isEmpty()) {
5354
var history = historyService.findLastKnownStatus(key);
5455
if (history.isPresent()) {
55-
return Optional.ofNullable(history.get().getData());
56+
return Optional.ofNullable(history.get());
5657
}
5758
return Optional.empty();
5859
} else {
59-
return Optional.ofNullable(trigger.get().getData());
60+
return Optional.ofNullable(trigger.get());
6061
}
6162
}
6263

63-
public Optional<TriggerEntity> getLastDetailData(TriggerKey key) {
64-
var data = historyService.findAllDetailsForKey(key, Pageable.ofSize(1));
65-
if (data.isEmpty()) {
66-
return Optional.empty();
67-
}
68-
return Optional.of(data.getContent().get(0).getData());
69-
}
70-
7164
@EventListener
7265
void queue(TriggerTaskCommand<? extends Serializable> event) {
7366
if (event.size() == 1) {
@@ -167,4 +160,10 @@ public Optional<TriggerEntity> findLastTriggerByCorrelationId(String correlation
167160
}
168161
return result.isEmpty() ? Optional.empty() : Optional.of(result.getFirst());
169162
}
163+
164+
public Optional<HistoryTriggerEntity> getLastTriggerHistory(Long id) {
165+
var result = historyService.findAllDetailsForInstance(id, PageRequest.ofSize(1));
166+
if (result.isEmpty()) return Optional.empty();
167+
return Optional.of(result.getContent().getFirst());
168+
}
170169
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.sterl.spring.persistent_tasks.api;
2+
3+
import java.time.OffsetDateTime;
4+
5+
import org.springframework.lang.Nullable;
6+
7+
import lombok.Data;
8+
9+
@Data
10+
public class HistoryTrigger {
11+
12+
/** just a unique id of this trigger */
13+
private Long id;
14+
15+
private Long instanceId;
16+
17+
/** the business key which is unique it is combination for triggers but not the history! */
18+
private TriggerKey key;
19+
20+
private OffsetDateTime createdTime;
21+
22+
@Nullable
23+
private OffsetDateTime start;
24+
25+
private int executionCount = 0;
26+
27+
private TriggerStatus status;
28+
29+
@Nullable
30+
private String message;
31+
}

core/src/main/java/org/sterl/spring/persistent_tasks/api/Trigger.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import java.time.OffsetDateTime;
44

5+
import org.springframework.lang.Nullable;
6+
57
import lombok.Data;
68

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

20+
@Nullable
1821
private String tag;
1922

23+
@Nullable
2024
private String correlationId;
2125

26+
@Nullable
2227
private String runningOn;
2328

24-
private OffsetDateTime createdTime = OffsetDateTime.now();
29+
private OffsetDateTime createdTime;
2530

26-
private OffsetDateTime runAt = OffsetDateTime.now();
31+
private OffsetDateTime runAt;
2732

33+
@Nullable
2834
private OffsetDateTime lastPing;
2935

36+
@Nullable
3037
private OffsetDateTime start;
3138

39+
@Nullable
3240
private OffsetDateTime end;
3341

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

3947
private TriggerStatus status = TriggerStatus.WAITING;
4048

49+
@Nullable
4150
private Long runningDurationInMs;
4251

52+
@Nullable
4353
private Object state;
4454

55+
@Nullable
4556
private String exceptionName;
57+
@Nullable
4658
private String lastException;
4759
}

core/src/main/java/org/sterl/spring/persistent_tasks/api/TriggerSearch.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,18 @@ public boolean hasValue() {
2626
|| StringHelper.hasValue(tag);
2727
}
2828

29-
3029
public static TriggerSearch byCorrelationId(String correlationId) {
3130
var result = new TriggerSearch();
3231
result.setCorrelationId(correlationId);
3332
return result;
3433
}
34+
3535
public static TriggerSearch byStatus(TriggerStatus status) {
3636
var result = new TriggerSearch();
3737
result.setStatus(status);
3838
return result;
3939
}
40+
4041
public static TriggerSearch forTriggerRequest(TriggerRequest<?> trigger) {
4142
var search = new TriggerSearch();
4243
if (trigger.key() != null) {
@@ -57,12 +58,12 @@ public static TriggerSearch forTriggerRequest(TriggerRequest<?> trigger) {
5758
public static Sort sortByCreatedTime(Direction direction) {
5859
return Sort.by(direction, "data.createdTime");
5960
}
61+
6062
public static Pageable applyDefaultSortIfNeeded(Pageable page) {
6163
var result = page;
6264
if (page.getSort() == Sort.unsorted()) {
6365
result = PageRequest.of(page.getPageNumber(), page.getPageSize(), DEFAULT_SORT);
6466
}
6567
return result;
6668
}
67-
6869
}

core/src/main/java/org/sterl/spring/persistent_tasks/history/HistoryService.java

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.sterl.spring.persistent_tasks.history.model.QCompletedTriggerEntity;
2323
import org.sterl.spring.persistent_tasks.history.repository.CompletedTriggerRepository;
2424
import org.sterl.spring.persistent_tasks.history.repository.TriggerHistoryDetailRepository;
25+
import org.sterl.spring.persistent_tasks.shared.QueryHelper;
2526
import org.sterl.spring.persistent_tasks.shared.model.HasTrigger;
2627
import org.sterl.spring.persistent_tasks.shared.stereotype.TransactionalService;
2728

@@ -53,9 +54,10 @@ public void deleteAll() {
5354
triggerHistoryDetailRepository.deleteAllInBatch();
5455
}
5556

56-
public void deleteAllOlderThan(OffsetDateTime age) {
57-
completedTriggerRepository.deleteOlderThan(age);
58-
triggerHistoryDetailRepository.deleteOlderThan(age);
57+
public long deleteAllOlderThan(OffsetDateTime age) {
58+
var result = triggerHistoryDetailRepository.deleteOlderThan(age);
59+
result += completedTriggerRepository.deleteOlderThan(age);
60+
return result;
5961
}
6062

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

68-
public List<HistoryTriggerEntity> findAllDetailsForInstance(long instanceId) {
69-
return triggerHistoryDetailRepository.findAllByInstanceId(instanceId);
70-
}
71-
72-
public Page<HistoryTriggerEntity> findAllDetailsForKey(TriggerKey key) {
73-
return findAllDetailsForKey(key, PageRequest.of(0, 100));
74-
}
75-
public Page<HistoryTriggerEntity> findAllDetailsForKey(TriggerKey key, Pageable page) {
76-
page = applyDefaultSortIfNeeded(page);
77-
return triggerHistoryDetailRepository.listKnownStatusFor(key, page);
70+
public Page<HistoryTriggerEntity> findAllDetailsForInstance(long instanceId, Pageable page) {
71+
page = QueryHelper.applySortIfEmpty(page, Sort.by(Direction.DESC, "id"));
72+
return triggerHistoryDetailRepository.findAllByInstanceId(instanceId, page);
7873
}
7974

8075
public Optional<TriggerKey> reQueue(Long id, OffsetDateTime runAt) {

core/src/main/java/org/sterl/spring/persistent_tasks/history/HistoryTimer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ class HistoryTimer {
3030
void deleteOldHistory() {
3131
try {
3232
final var age = OffsetDateTime.now().minus(historyTimeout);
33-
historyService.deleteAllOlderThan(age);
34-
log.debug("Deleted triggers older than {}.", historyTimeout);
33+
var count = historyService.deleteAllOlderThan(age);
34+
log.debug("Deleted history {} older than {}.", count, historyTimeout);
3535
} catch (Exception e) {
3636
log.error("Failed to delete old triggers", e);
3737
}

core/src/main/java/org/sterl/spring/persistent_tasks/history/api/HistoryConverter.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.sterl.spring.persistent_tasks.history.api;
22

33
import org.springframework.lang.NonNull;
4+
import org.springframework.lang.Nullable;
45
import org.sterl.spring.persistent_tasks.api.Trigger;
6+
import org.sterl.spring.persistent_tasks.api.HistoryTrigger;
57
import org.sterl.spring.persistent_tasks.history.model.CompletedTriggerEntity;
68
import org.sterl.spring.persistent_tasks.history.model.HistoryTriggerEntity;
79
import org.sterl.spring.persistent_tasks.shared.ExtendetConvert;
@@ -22,16 +24,23 @@ public Trigger convert(@NonNull CompletedTriggerEntity source) {
2224
}
2325
}
2426

25-
enum FromTriggerStateDetailEntity implements ExtendetConvert<HistoryTriggerEntity, Trigger> {
27+
enum ToHistoryTrigger implements ExtendetConvert<HistoryTriggerEntity, HistoryTrigger> {
2628
INSTANCE;
2729

28-
@NonNull
2930
@Override
30-
public Trigger convert(@NonNull HistoryTriggerEntity source) {
31-
var result = ToTrigger.INSTANCE.convert(source);
31+
@Nullable
32+
public HistoryTrigger convert(@NonNull HistoryTriggerEntity source) {
33+
var result = new HistoryTrigger();
34+
result.setCreatedTime(source.getCreatedTime());
35+
result.setExecutionCount(source.getExecutionCount());
3236
result.setId(source.getId());
3337
result.setInstanceId(source.getInstanceId());
38+
result.setKey(source.getKey());
39+
result.setMessage(source.getMessage());
40+
result.setStart(source.getStart());
41+
result.setStatus(source.getStatus());
3442
return result;
3543
}
44+
3645
}
3746
}

core/src/main/java/org/sterl/spring/persistent_tasks/history/api/TriggerHistoryResource.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@
1515
import org.sterl.spring.persistent_tasks.api.TaskStatusHistoryOverview;
1616
import org.sterl.spring.persistent_tasks.api.Trigger;
1717
import org.sterl.spring.persistent_tasks.api.TriggerGroup;
18+
import org.sterl.spring.persistent_tasks.api.HistoryTrigger;
1819
import org.sterl.spring.persistent_tasks.api.TriggerKey;
1920
import org.sterl.spring.persistent_tasks.api.TriggerSearch;
2021
import org.sterl.spring.persistent_tasks.history.HistoryService;
2122
import org.sterl.spring.persistent_tasks.history.api.HistoryConverter.FromLastTriggerStateEntity;
22-
import org.sterl.spring.persistent_tasks.history.api.HistoryConverter.FromTriggerStateDetailEntity;
23+
import org.sterl.spring.persistent_tasks.history.api.HistoryConverter.ToHistoryTrigger;
2324

2425
import lombok.RequiredArgsConstructor;
2526

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

3435
@GetMapping("history/instance/{instanceId}")
35-
public List<Trigger> listInstances(@PathVariable("instanceId") long instanceId) {
36-
return FromTriggerStateDetailEntity.INSTANCE.convert( //
37-
historyService.findAllDetailsForInstance(instanceId));
36+
public PagedModel<HistoryTrigger> listInstances(
37+
@PathVariable("instanceId") long instanceId,
38+
@PageableDefault(size = 250) Pageable page) {
39+
40+
return ToHistoryTrigger.INSTANCE.toPage(historyService.findAllDetailsForInstance(instanceId, page));
3841
}
3942
@GetMapping("task-status-history")
4043
public List<TaskStatusHistoryOverview> taskStatusHistory() {

core/src/main/java/org/sterl/spring/persistent_tasks/history/component/TriggerHistoryComponent.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.sterl.spring.persistent_tasks.history.component;
22

3-
import java.time.OffsetDateTime;
4-
3+
import org.apache.commons.lang3.StringUtils;
54
import org.springframework.context.event.EventListener;
65
import org.springframework.scheduling.annotation.Async;
76
import org.springframework.stereotype.Component;
@@ -64,11 +63,16 @@ public void execute(final long triggerId, final TriggerEntity data, boolean isDo
6463
}
6564

6665
var detail = new HistoryTriggerEntity();
66+
detail.setExecutionCount(data.getExecutionCount());
6767
detail.setInstanceId(triggerId);
68-
detail.setData(data.toBuilder()
69-
.state(null)
70-
.createdTime(OffsetDateTime.now())
71-
.build());
68+
detail.setKey(data.getKey());
69+
70+
var msg = data.getExceptionName();
71+
if (data.getLastException() != null) msg = data.getLastException();
72+
detail.setMessage(StringUtils.substring(msg, 0, 200));
73+
74+
detail.setStart(data.getStart());
75+
detail.setStatus(data.getStatus());
7276
triggerHistoryDetailRepository.save(detail);
7377
}
7478
}

0 commit comments

Comments
 (0)