Skip to content

Commit 153a585

Browse files
committed
showing history
1 parent 48b710f commit 153a585

File tree

10 files changed

+86
-14
lines changed

10 files changed

+86
-14
lines changed

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
# Changelog
22

3-
## [v1.0.1]
3+
## [v1.0.1]
4+
5+
- Showing trigger history entries
6+
- Added PersistentTaskService as a abstraction

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ Secondary goal is to support [Poor mans Workflow](https://github.com/sterlp/pmw)
1010

1111
# Setup and Run a Task
1212

13+
- [JavaDoc](https://sterlp.github.io/spring-persistent-tasks/javadoc-core/)
14+
1315
## Maven
1416

1517
- [Maven Central spring-persistent-tasks-core](https://central.sonatype.com/artifact/org.sterl.spring/spring-persistent-tasks-core/versions)
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.sterl.spring.persistent_tasks;
2+
3+
import java.io.Serializable;
4+
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.context.event.EventListener;
7+
import org.springframework.stereotype.Service;
8+
import org.sterl.spring.persistent_tasks.api.AddTriggerRequest;
9+
import org.sterl.spring.persistent_tasks.api.TriggerKey;
10+
import org.sterl.spring.persistent_tasks.api.event.TriggerTaskCommand;
11+
import org.sterl.spring.persistent_tasks.scheduler.SchedulerService;
12+
import org.sterl.spring.persistent_tasks.trigger.TriggerService;
13+
14+
/**
15+
* Abstraction to {@link SchedulerService} or {@link TriggerService}
16+
* depends on if the {@link SchedulerService} is available.
17+
*/
18+
@Service
19+
public class PersistentTaskService {
20+
21+
@Autowired(required = false)
22+
private SchedulerService schedulerService;
23+
@Autowired
24+
private TriggerService triggerService;
25+
26+
@EventListener
27+
void queue(TriggerTaskCommand<? extends Serializable> event) {
28+
if (event.triggers().size() == 1) {
29+
runOrQueue(event.triggers().iterator().next());
30+
} else {
31+
triggerService.queueAll(event.triggers());
32+
}
33+
}
34+
35+
/**
36+
* Runs the given trigger if a free threads are available
37+
* and the runAt time is not in the future.
38+
* @return the reference to the {@link TriggerKey}
39+
*/
40+
public <T extends Serializable> TriggerKey runOrQueue(
41+
AddTriggerRequest<T> triggerRequest) {
42+
if (schedulerService == null) {
43+
schedulerService.runOrQueue(triggerRequest);
44+
} else {
45+
triggerService.queue(triggerRequest);
46+
}
47+
return triggerRequest.key();
48+
}
49+
}

core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,11 @@ public List<Future<TriggerKey>> triggerNextTasks(OffsetDateTime timeDue) {
117117
}
118118

119119
/**
120-
* Runs the next trigger if free threads are available
120+
* Runs the given trigger if a free threads are available
121121
* and the runAt time is not in the future.
122122
*/
123-
public Optional<Future<TriggerKey>> runOrQueue(AddTriggerRequest<? extends Serializable> triggerRequest) {
123+
public <T extends Serializable> Optional<Future<TriggerKey>> runOrQueue(
124+
AddTriggerRequest<T> triggerRequest) {
124125
return trx.execute(t -> {
125126
Optional<Future<TriggerKey>> result = Optional.empty();
126127
var trigger = triggerService.queue(triggerRequest);

core/src/main/java/org/sterl/spring/persistent_tasks/trigger/TriggerService.java

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

9-
import org.springframework.context.event.EventListener;
109
import org.springframework.data.domain.Page;
1110
import org.springframework.data.domain.Pageable;
1211
import org.springframework.lang.NonNull;
@@ -16,7 +15,6 @@
1615
import org.sterl.spring.persistent_tasks.api.AddTriggerRequest;
1716
import org.sterl.spring.persistent_tasks.api.TaskId;
1817
import org.sterl.spring.persistent_tasks.api.TriggerKey;
19-
import org.sterl.spring.persistent_tasks.api.event.TriggerTaskCommand;
2018
import org.sterl.spring.persistent_tasks.shared.model.TriggerStatus;
2119
import org.sterl.spring.persistent_tasks.shared.stereotype.TransactionalService;
2220
import org.sterl.spring.persistent_tasks.task.TaskService;
@@ -45,13 +43,20 @@ public class TriggerService {
4543
* and handle any errors etc.
4644
*
4745
* @param trigger the {@link TriggerEntity} to run
48-
* @return the reference to the updated {@link TriggerEntity}
46+
* @return the reference to the found an executed {@link TriggerEntity}
4947
*/
5048
@Transactional(propagation = Propagation.NEVER)
5149
public Optional<TriggerEntity> run(@Nullable TriggerEntity trigger) {
5250
return runTrigger.execute(trigger);
5351
}
5452

53+
/**
54+
* The main purpose of this method is to simplify testing and run just one trigger.
55+
*
56+
* @param triggerKey the key to trigger which should be executed
57+
* @param runningOn just any string, could be test for testing, usually the scheduler name
58+
* @return the reference to the found an executed {@link TriggerEntity}
59+
*/
5560
@Transactional(propagation = Propagation.NEVER)
5661
public Optional<TriggerEntity> run(TriggerKey triggerKey, String runningOn) {
5762
final TriggerEntity trigger = lockNextTrigger.lock(triggerKey, runningOn);
@@ -106,11 +111,14 @@ public boolean hasPendingTriggers() {
106111
return readTrigger.hasPendingTriggers();
107112
}
108113

109-
@EventListener
110-
public void queue(TriggerTaskCommand<? extends Serializable> event) {
111-
queueAll(event.triggers());
112-
}
113-
114+
/**
115+
* Adds or updates an existing trigger based on its {@link TriggerKey}
116+
*
117+
* @param <T> the state type
118+
* @param tigger the {@link AddTriggerRequest} to save
119+
* @return the saved {@link TriggerEntity}
120+
* @throws IllegalStateException if the trigger already exists and is {@link TriggerStatus#RUNNING}
121+
*/
114122
public <T extends Serializable> TriggerEntity queue(AddTriggerRequest<T> tigger) {
115123
taskService.assertIsKnown(tigger.taskId());
116124
return editTrigger.addTrigger(tigger);

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.sterl.spring.persistent_tasks.api.TriggerKey;
1818
import org.sterl.spring.persistent_tasks.shared.model.TriggerData;
1919
import org.sterl.spring.persistent_tasks.shared.model.TriggerStatus;
20+
import org.sterl.spring.persistent_tasks.trigger.event.TriggerAddedEvent;
2021
import org.sterl.spring.persistent_tasks.trigger.event.TriggerCanceledEvent;
2122
import org.sterl.spring.persistent_tasks.trigger.event.TriggerCompleteEvent;
2223
import org.sterl.spring.persistent_tasks.trigger.event.TriggerFailedEvent;
@@ -90,14 +91,15 @@ public <T extends Serializable> TriggerEntity addTrigger(AddTriggerRequest<T> ti
9091
final Optional<TriggerEntity> existing = triggerRepository.findByKey(result.getKey());
9192
if (existing.isPresent()) {
9293
if (existing.get().isRunning())
93-
throw new IllegalStateException("Cannot update running trigger " + result.getKey());
94+
throw new IllegalStateException("Cannot update a running trigger " + result.getKey());
9495

9596
existing.get().setData(result.getData());
9697
result = existing.get();
9798
log.debug("Updated trigger={}", result);
9899
} else {
99100
result = triggerRepository.save(result);
100101
log.debug("Added trigger={}", result);
102+
publisher.publishEvent(new TriggerAddedEvent(result));
101103
}
102104
return result;
103105
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.sterl.spring.persistent_tasks.trigger.event;
2+
3+
import org.sterl.spring.persistent_tasks.trigger.model.TriggerEntity;
4+
5+
public record TriggerAddedEvent(TriggerEntity trigger) implements TriggerLifeCycleEvent {
6+
7+
}

screenshots/triggers-screen.png

-30.8 KB
Loading

ui/src/history/view/trigger-history.view.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const TriggerHistoryListView = ({ triggers }: { triggers?: Trigger[] }) => {
2020
<Col>
2121
<TriggerStatusView data={t} />
2222
<strong>
23-
{" " + formatDateTime(t.createdTime)}:
23+
{" at " + formatDateTime(t.createdTime)}
2424
</strong>
2525
</Col>
2626
<Col>

upload.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
mvn clean deploy -DskipTests -Prelease
1+
mvn clean source:jar javadoc:jar deploy -DskipTests -Prelease

0 commit comments

Comments
 (0)