Skip to content

Commit 238df1e

Browse files
committed
write history only if the trigger is done
1 parent 16527da commit 238df1e

20 files changed

+150
-127
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## v1.5.0
4+
5+
- Adjusted transaction handling for trigger life cycle events
6+
- Base event entry is only written for done/finished trigger
7+
38
## v1.4.6 - (2025-01-08)
49

510
- Trigger history with more details - not waiting for the transaction

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

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.sterl.spring.persistent_tasks.api;
2+
3+
import java.time.OffsetDateTime;
4+
5+
public record TaskHistoryOverview(
6+
String taskName,
7+
long executionCount,
8+
OffsetDateTime firstRun,
9+
OffsetDateTime lastRun,
10+
double maxDurationMs,
11+
double minDurationMs,
12+
double avgDurationMs
13+
) {
14+
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.springframework.data.domain.Sort;
1111
import org.springframework.data.domain.Sort.Direction;
1212
import org.springframework.lang.Nullable;
13+
import org.sterl.spring.persistent_tasks.api.TaskHistoryOverview;
1314
import org.sterl.spring.persistent_tasks.api.TriggerKey;
1415
import org.sterl.spring.persistent_tasks.api.TriggerStatus;
1516
import org.sterl.spring.persistent_tasks.history.model.TriggerHistoryDetailEntity;
@@ -116,4 +117,8 @@ private Pageable applyDefaultSortIfNeeded(Pageable page) {
116117
}
117118
return page;
118119
}
120+
121+
public List<TaskHistoryOverview> taskHistory() {
122+
return triggerHistoryDetailRepository.listTaskHistoryOverview();
123+
}
119124
}

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

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

55
import org.apache.commons.lang3.StringUtils;
66
import org.springframework.data.domain.Pageable;
7-
import org.springframework.data.domain.Sort.Direction;
87
import org.springframework.data.web.PageableDefault;
98
import org.springframework.data.web.PagedModel;
109
import org.springframework.web.bind.annotation.GetMapping;
1110
import org.springframework.web.bind.annotation.PathVariable;
1211
import org.springframework.web.bind.annotation.RequestMapping;
1312
import org.springframework.web.bind.annotation.RequestParam;
1413
import org.springframework.web.bind.annotation.RestController;
14+
import org.sterl.spring.persistent_tasks.api.TaskHistoryOverview;
1515
import org.sterl.spring.persistent_tasks.api.Trigger;
1616
import org.sterl.spring.persistent_tasks.api.TriggerKey;
1717
import org.sterl.spring.persistent_tasks.history.HistoryService;
@@ -32,12 +32,16 @@ public List<Trigger> listInstances(@PathVariable("instanceId") long instanceId)
3232
return FromTriggerStateDetailEntity.INSTANCE.convert( //
3333
historyService.findAllDetailsForInstance(instanceId));
3434
}
35+
@GetMapping("task-history")
36+
public List<TaskHistoryOverview> taskHistory() {
37+
return historyService.taskHistory();
38+
}
3539

3640
@GetMapping("history")
3741
public PagedModel<Trigger> list(
3842
@RequestParam(name = "id", required = false) String id,
3943
@RequestParam(name = "taskName", required = false) String taskName,
40-
@PageableDefault(size = 100, direction = Direction.DESC, sort = "id") Pageable pageable) {
44+
@PageableDefault(size = 100) Pageable pageable) {
4145

4246
return FromLastTriggerStateEntity.INSTANCE.toPage( //
4347
historyService.findTriggerState(

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,27 @@ public void onRunning(TriggerRunningEvent e) {
3939
e.getClass().getSimpleName(),
4040
e.key(), e.status());
4141

42-
execute(e.id(), e.data());
42+
execute(e.id(), e.data(), false);
4343
}
4444

45-
// @Transactional(timeout = 10)
46-
// @EventListener
4745
@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
4846
void onPersistentTaskEvent(TriggerLifeCycleEvent e) {
4947
if (e instanceof TriggerRunningEvent) return; // we have an own listener for that
5048
log.debug("Received event={} for {} new status={}",
5149
e.getClass().getSimpleName(),
5250
e.key(), e.status());
5351

54-
execute(e.id(), e.data());
52+
53+
execute(e.id(), e.data(), e.isDone());
5554
}
5655

57-
public void execute(final long triggerId, final TriggerData data) {
58-
final var state = new TriggerHistoryLastStateEntity();
59-
state.setId(triggerId);
60-
state.setData(data.copy());
61-
triggerHistoryLastStateRepository.save(state);
56+
public void execute(final long triggerId, final TriggerData data, boolean isDone) {
57+
if (isDone) {
58+
final var state = new TriggerHistoryLastStateEntity();
59+
state.setId(triggerId);
60+
state.setData(data.copy());
61+
triggerHistoryLastStateRepository.save(state);
62+
}
6263

6364
var detail = new TriggerHistoryDetailEntity();
6465
detail.setInstanceId(triggerId);

core/src/main/java/org/sterl/spring/persistent_tasks/history/repository/TriggerHistoryDetailRepository.java

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,29 @@
22

33
import java.util.List;
44

5-
import org.springframework.data.domain.Page;
6-
import org.springframework.data.domain.Pageable;
75
import org.springframework.data.jpa.repository.Query;
86
import org.springframework.data.repository.query.Param;
9-
import org.sterl.spring.persistent_tasks.api.HistoryOverview;
7+
import org.sterl.spring.persistent_tasks.api.TaskHistoryOverview;
108
import org.sterl.spring.persistent_tasks.history.model.TriggerHistoryDetailEntity;
119

1210
public interface TriggerHistoryDetailRepository extends HistoryTriggerRepository<TriggerHistoryDetailEntity> {
1311

1412
@Query("""
15-
SELECT new org.sterl.spring.persistent_tasks.api.HistoryOverview(
16-
e.instanceId,
13+
SELECT new org.sterl.spring.persistent_tasks.api.TaskHistoryOverview(
1714
e.data.key.taskName,
1815
count(1) as entryCount,
19-
MIN(e.data.start) as start,
20-
MAX(e.data.end) as end,
21-
MIN(e.data.createdTime) as createdTime,
22-
MAX(e.data.executionCount) as executionCount,
23-
AVG(e.data.runningDurationInMs) as runningDurationInMs
16+
MIN(e.data.runAt) as firstRun,
17+
MAX(e.data.runAt) as lastRun,
18+
MAX(e.data.runningDurationInMs) as maxDuration,
19+
MIN(e.data.runningDurationInMs) as minDuration,
20+
AVG(e.data.runningDurationInMs) as avgDuration
2421
)
2522
FROM #{#entityName} e
26-
GROUP BY
27-
e.instanceId,
28-
e.data.key.taskName
29-
ORDER BY end DESC, createdTime DESC
23+
WHERE e.data.end IS NOT NULL
24+
GROUP BY e.data.key.taskName
25+
ORDER BY e.data.key.taskName ASC
3026
""")
31-
Page<HistoryOverview> listHistoryOverview(Pageable page);
27+
List<TaskHistoryOverview> listTaskHistoryOverview();
3228

3329
@Query("""
3430
SELECT e

core/src/main/java/org/sterl/spring/persistent_tasks/trigger/api/TriggerResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public long count() {
3939
public PagedModel<Trigger> list(
4040
@RequestParam(name = "id", required = false) String id,
4141
@RequestParam(name = "taskName", required = false) String taskName,
42-
@PageableDefault(size = 100, direction = Direction.DESC, sort = "id")
42+
@PageableDefault(size = 100, direction = Direction.ASC, sort = "data.runAt")
4343
Pageable pageable) {
4444
return FromTriggerEntity.INSTANCE.toPage(
4545
triggerService.findAllTriggers(

core/src/main/java/org/sterl/spring/persistent_tasks/trigger/component/EditTriggerComponent.java

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.util.List;
77
import java.util.Optional;
88

9+
import org.slf4j.event.Level;
910
import org.springframework.context.ApplicationEventPublisher;
1011
import org.springframework.lang.NonNull;
1112
import org.springframework.stereotype.Component;
@@ -35,40 +36,51 @@ public class EditTriggerComponent {
3536
private final TriggerRepository triggerRepository;
3637

3738
public Optional<TriggerEntity> completeTaskWithSuccess(TriggerKey key, Serializable state) {
38-
return this.completeTaskWithStatus(key, state, null);
39+
final Optional<TriggerEntity> result = triggerRepository.findByKey(key);
40+
41+
result.ifPresent(t -> {
42+
t.complete(null);
43+
publisher.publishEvent(new TriggerSuccessEvent(
44+
t.getId(), t.copyData(), state));
45+
log.debug("Setting {} to status={}", key, t.getData().getStatus());
46+
triggerRepository.delete(t);
47+
});
48+
return result;
3949
}
4050

4151
/**
4252
* Sets success or error based on the fact if an exception is given or not.
4353
*/
44-
public Optional<TriggerEntity> completeTaskWithStatus(TriggerKey key, Serializable state, Exception e) {
54+
public Optional<TriggerEntity> failTrigger(
55+
TriggerKey key,
56+
Serializable state,
57+
Exception e,
58+
OffsetDateTime retryAt) {
4559
final Optional<TriggerEntity> result = triggerRepository.findByKey(key);
4660

61+
4762
result.ifPresent(t -> {
63+
log.atLevel(retryAt == null ? Level.ERROR : Level.WARN)
64+
.setCause(e)
65+
.log("{} failed, retryAt={}",
66+
key, retryAt == null ? "no" : retryAt);
4867
t.complete(e);
68+
publisher.publishEvent(new TriggerFailedEvent(t.getId(), t.copyData(), state, e, retryAt));
4969

50-
if (t.getData().getStatus() == TriggerStatus.SUCCESS) {
51-
publisher.publishEvent(new TriggerSuccessEvent(
52-
t.getId(), t.copyData(), state));
53-
log.debug("Setting {} to status={} {}", key, t.getData().getStatus(),
54-
e == null ? "" : "error=" + e.getClass().getSimpleName());
70+
if (retryAt == null) {
71+
triggerRepository.delete(t);
5572
} else {
56-
publisher.publishEvent(new TriggerFailedEvent(t.getId(), t.copyData(), state, e));
57-
log.info("Setting {} to status={} {}", key, t.getData().getStatus(),
58-
e == null ? "" : "error=" + e.getClass().getSimpleName());
73+
t.runAt(retryAt);
5974
}
60-
6175
});
76+
if (result.isEmpty()) {
77+
log.error("Trigger with key={} not found and may be at a wrong state!",
78+
key, e);
79+
}
6280

6381
return result;
6482
}
6583

66-
public Optional<TriggerEntity> retryTrigger(TriggerKey id, OffsetDateTime retryAt) {
67-
return triggerRepository //
68-
.findByKey(id) //
69-
.map(t -> t.runAt(retryAt));
70-
}
71-
7284
public Optional<TriggerEntity> cancelTask(TriggerKey id) {
7385
return triggerRepository //
7486
.findByKey(id) //

core/src/main/java/org/sterl/spring/persistent_tasks/trigger/component/HandleTriggerExceptionComponent.java

Lines changed: 0 additions & 55 deletions
This file was deleted.

0 commit comments

Comments
 (0)