Skip to content

Commit 4a7dfea

Browse files
committed
added test jar
1 parent ebbecbf commit 4a7dfea

File tree

19 files changed

+589
-163
lines changed

19 files changed

+589
-163
lines changed

core/pom.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,6 @@
5151
<version>${project.version}</version>
5252
<scope>test</scope>
5353
</dependency>
54-
<dependency>
55-
<groupId>${project.groupId}</groupId>
56-
<artifactId>spring-persistent-tasks-test</artifactId>
57-
<version>${project.version}</version>
58-
<scope>test</scope>
59-
</dependency>
6054

6155
<dependency>
6256
<groupId>org.liquibase</groupId>

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

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
public class PersistentTaskService {
3838

3939
private final Optional<SchedulerService> schedulerService;
40-
private final List<SchedulerService> schedulers;
4140
private final TriggerService triggerService;
4241
private final HistoryService historyService;
4342

@@ -125,63 +124,6 @@ public <T extends Serializable> TriggerKey runOrQueue(
125124
return triggerRequest.key();
126125
}
127126

128-
/**
129-
* Triggers the execution of all pending triggers.
130-
*
131-
* @return the reference to the {@link TriggerKey} of the running tasks
132-
*/
133-
public List<Future<TriggerKey>> executeTriggers() {
134-
var result = new ArrayList<Future<TriggerKey>>();
135-
for (SchedulerService s : schedulers) {
136-
result.addAll(s.triggerNextTasks());
137-
}
138-
return result;
139-
}
140-
141-
/**
142-
* Triggers the execution of all pending triggers and wait for the result.
143-
*/
144-
@SneakyThrows
145-
public List<TriggerKey> executeTriggersAndWait(Duration maxWaitTime) {
146-
final var result = new ArrayList<TriggerKey>();
147-
final var timeOut = System.currentTimeMillis() + maxWaitTime.toMillis();
148-
149-
List<Future<TriggerKey>> triggers;
150-
var isSomethingRunning = false;
151-
do {
152-
triggers = executeTriggers();
153-
for (Future<TriggerKey> future : triggers) {
154-
try {
155-
result.add(future.get());
156-
} catch (InterruptedException | ExecutionException e) {
157-
final Throwable cause = e.getCause();
158-
throw cause == null ? e : cause;
159-
}
160-
}
161-
162-
isSomethingRunning = hasRunningTriggers();
163-
if (isSomethingRunning) {
164-
Thread.sleep(Duration.ofMillis(100));
165-
}
166-
167-
if (System.currentTimeMillis() > timeOut) {
168-
throw new RuntimeException("Timeout waiting for triggers after " + maxWaitTime);
169-
}
170-
171-
} while (!triggers.isEmpty() || isSomethingRunning);
172-
173-
return result;
174-
}
175-
176-
private boolean hasRunningTriggers() {
177-
var running = this.schedulers.stream()
178-
.map(s -> s.hasRunningTriggers())
179-
.filter(r -> r)
180-
.findAny();
181-
182-
return running.isPresent() && running.get() == true;
183-
}
184-
185127
/**
186128
* Returns all triggers for a correlationId sorted by the creation time.
187129
* @param correlationId the id to search for

core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.net.UnknownHostException;
44
import java.time.Duration;
55
import java.util.Optional;
6-
import java.util.concurrent.TimeoutException;
76

87
import org.junit.jupiter.api.AfterEach;
98
import org.junit.jupiter.api.BeforeEach;
@@ -20,18 +19,18 @@
2019
import org.springframework.transaction.PlatformTransactionManager;
2120
import org.springframework.transaction.support.TransactionTemplate;
2221
import org.sterl.spring.persistent_tasks.api.TaskId;
23-
import org.sterl.spring.persistent_tasks.api.TriggerStatus;
2422
import org.sterl.spring.persistent_tasks.api.event.TriggerTaskCommand;
2523
import org.sterl.spring.persistent_tasks.api.task.PersistentTask;
2624
import org.sterl.spring.persistent_tasks.history.HistoryService;
2725
import org.sterl.spring.persistent_tasks.scheduler.SchedulerService;
2826
import org.sterl.spring.persistent_tasks.scheduler.component.EditSchedulerStatusComponent;
2927
import org.sterl.spring.persistent_tasks.scheduler.component.TaskExecutorComponent;
3028
import org.sterl.spring.persistent_tasks.task.TaskService;
29+
import org.sterl.spring.persistent_tasks.test.AsyncAsserts;
30+
import org.sterl.spring.persistent_tasks.test.PersistentTaskTestService;
3131
import org.sterl.spring.persistent_tasks.trigger.TriggerService;
3232
import org.sterl.spring.persistent_tasks.trigger.model.TriggerEntity;
3333
import org.sterl.spring.sample_app.SampleApp;
34-
import org.sterl.test.AsyncAsserts;
3534
import org.sterl.test.hibernate_asserts.HibernateAsserts;
3635

3736
import jakarta.persistence.EntityManager;
@@ -43,7 +42,7 @@
4342
public class AbstractSpringTest {
4443

4544
@Autowired
46-
protected PersistentTaskService persistentTaskService;
45+
protected PersistentTaskTestService persistentTaskTestService;
4746

4847
@Autowired
4948
@Qualifier("schedulerA")
@@ -162,18 +161,9 @@ PersistentTask<Long> slowTask(AsyncAsserts asserts) {
162161
}
163162
}
164163

164+
@Deprecated
165165
protected Optional<TriggerEntity> runNextTrigger() {
166-
return triggerService.run(triggerService.lockNextTrigger("test"));
167-
}
168-
169-
protected void awaitRunningTasks() throws TimeoutException, InterruptedException {
170-
final long start = System.currentTimeMillis();
171-
while (triggerService.countTriggers(TriggerStatus.RUNNING) > 0) {
172-
if (System.currentTimeMillis() - start > 2000) {
173-
throw new TimeoutException("Still running after 2s");
174-
}
175-
Thread.sleep(100);
176-
}
166+
return persistentTaskTestService.runNextTrigger();
177167
}
178168

179169
@BeforeEach
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.sterl.spring.persistent_tasks;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.util.UUID;
6+
import java.util.concurrent.atomic.AtomicReference;
7+
8+
import org.junit.jupiter.api.Test;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.context.ApplicationEventPublisher;
11+
import org.sterl.spring.persistent_tasks.api.TaskId;
12+
import org.sterl.spring.persistent_tasks.api.event.TriggerTaskCommand;
13+
import org.sterl.spring.persistent_tasks.api.task.RunningTriggerContextHolder;
14+
15+
class PersistentTaskServiceTest extends AbstractSpringTest {
16+
@Autowired
17+
private PersistentTaskService subject;
18+
@Autowired
19+
private ApplicationEventPublisher eventPublisher;
20+
21+
22+
@Test
23+
void testChainedTasks() throws Exception {
24+
// GIVEN
25+
final AtomicReference<String> correlationFound = new AtomicReference<>();
26+
27+
final TaskId<Integer> task1 = taskService.replace("chainTask1", s -> {
28+
var state = RunningTriggerContextHolder.getContext();
29+
asserts.info(state.getData() + "::chainTask1");
30+
eventPublisher.publishEvent(
31+
TriggerTaskCommand.of("chainTask2", state.getData() + "::chainTask1",
32+
UUID.randomUUID().toString())); // should be ignored!
33+
});
34+
35+
taskService.replace("chainTask2", s -> {
36+
var state = RunningTriggerContextHolder.getContext();
37+
correlationFound.set(state.getCorrelationId());
38+
asserts.info("chainTask1::" + state.getData());
39+
assertThat(state.getCorrelationId()).isEqualTo(RunningTriggerContextHolder.getCorrelationId());
40+
});
41+
final var correlationId = UUID.randomUUID().toString();
42+
43+
// WHEN
44+
subject.runOrQueue(task1.newTrigger(234).correlationId(correlationId).build());
45+
46+
// THEN
47+
asserts.awaitOrdered("234::chainTask1", "chainTask1::234::chainTask1");
48+
assertThat(correlationId).isEqualTo(correlationFound.get());
49+
// AND
50+
var trigger= subject.findAllTriggerByCorrelationId(correlationId);
51+
assertThat(trigger).hasSize(2);
52+
assertThat(trigger.get(0).getCorrelationId()).isEqualTo(correlationId);
53+
assertThat(trigger.get(1).getCorrelationId()).isEqualTo(correlationId);
54+
}
55+
}

core/src/test/java/org/sterl/spring/persistent_tasks/TaskSchedulerServiceTest.java

Lines changed: 6 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,22 @@
33
import static org.assertj.core.api.Assertions.assertThat;
44

55
import java.time.Duration;
6-
import java.util.ArrayList;
7-
import java.util.UUID;
8-
import java.util.concurrent.Callable;
9-
import java.util.concurrent.atomic.AtomicReference;
106

117
import org.junit.jupiter.api.Test;
12-
import org.springframework.beans.factory.annotation.Autowired;
13-
import org.springframework.context.ApplicationEventPublisher;
8+
import org.springframework.lang.Nullable;
149
import org.sterl.spring.persistent_tasks.api.RetryStrategy;
1510
import org.sterl.spring.persistent_tasks.api.TaskId;
1611
import org.sterl.spring.persistent_tasks.api.TriggerStatus;
17-
import org.sterl.spring.persistent_tasks.api.event.TriggerTaskCommand;
1812
import org.sterl.spring.persistent_tasks.api.task.PersistentTask;
19-
import org.sterl.spring.persistent_tasks.api.task.RunningTriggerContextHolder;
2013

2114
class TaskSchedulerServiceTest extends AbstractSpringTest {
22-
@Autowired
23-
private ApplicationEventPublisher eventPublisher;
24-
2515
@Test
2616
void testFailedTasksAreRetried() throws Exception {
2717
// GIVEN
2818
TaskId<String> task = taskService.<String>replace("foo",
2919
new PersistentTask<String>() {
3020
@Override
31-
public void accept(String state) {
21+
public void accept(@Nullable String state) {
3222
asserts.info(state);
3323
throw new RuntimeException("NOPE!");
3424
}
@@ -41,8 +31,8 @@ public RetryStrategy retryStrategy() {
4131
var runTrigger = triggerService.queue(task.newTrigger().state("hallo").build());
4232

4333
// WHEN
44-
persistentTaskService.executeTriggersAndWait(Duration.ofSeconds(2));
45-
persistentTaskService.executeTriggersAndWait(Duration.ofSeconds(1));
34+
persistentTaskTestService.assertHasNextTask();
35+
persistentTaskTestService.assertHasNextTask();
4636

4737
// THEN
4838
assertThat(asserts.getCount("hallo")).isEqualTo(4);
@@ -63,51 +53,13 @@ void testLockTriggerInSchedulers() throws Exception {
6353
}
6454

6555
// WHEN
66-
ArrayList<Callable<?>> lockInvocations = new ArrayList<>();
67-
for (int i = 1; i <= 100; ++i) {
68-
lockInvocations.add(() -> runNextTrigger());
69-
}
70-
71-
persistentTaskService.executeTriggersAndWait(Duration.ofSeconds(2));
56+
var executedKeys = persistentTaskTestService.scheduleNextTriggersAndWait(Duration.ofSeconds(3));
7257

7358
// THEN
59+
assertThat(executedKeys).hasSize(100);
7460
for (int i = 1; i <= 100; ++i) {
7561
asserts.awaitValueOnce("t" + i);
7662
}
7763
assertThat(historyService.countTriggers(TriggerStatus.SUCCESS)).isEqualTo(100);
7864
}
79-
80-
@Test
81-
void testChainedTasks() throws Exception {
82-
// GIVEN
83-
final AtomicReference<String> correlationFound = new AtomicReference<>();
84-
85-
final TaskId<Integer> task1 = taskService.replace("chainTask1", s -> {
86-
var state = RunningTriggerContextHolder.getContext();
87-
asserts.info(state.getData() + "::chainTask1");
88-
eventPublisher.publishEvent(
89-
TriggerTaskCommand.of("chainTask2", state.getData() + "::chainTask1",
90-
UUID.randomUUID().toString())); // should be ignored!
91-
});
92-
93-
taskService.replace("chainTask2", s -> {
94-
var state = RunningTriggerContextHolder.getContext();
95-
correlationFound.set(state.getCorrelationId());
96-
asserts.info("chainTask1::" + state.getData());
97-
assertThat(state.getCorrelationId()).isEqualTo(RunningTriggerContextHolder.getCorrelationId());
98-
});
99-
final var correlationId = UUID.randomUUID().toString();
100-
101-
// WHEN
102-
persistentTaskService.runOrQueue(task1.newTrigger(234).correlationId(correlationId).build());
103-
104-
// THEN
105-
asserts.awaitOrdered("234::chainTask1", "chainTask1::234::chainTask1");
106-
assertThat(correlationId).isEqualTo(correlationFound.get());
107-
// AND
108-
var trigger= persistentTaskService.findAllTriggerByCorrelationId(correlationId);
109-
assertThat(trigger).hasSize(2);
110-
assertThat(trigger.get(0).getCorrelationId()).isEqualTo(correlationId);
111-
assertThat(trigger.get(1).getCorrelationId()).isEqualTo(correlationId);
112-
}
11365
}

core/src/test/java/org/sterl/spring/persistent_tasks/history/HistoryServiceTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import static org.assertj.core.api.Assertions.assertThat;
44

5-
import java.time.Duration;
65
import java.time.OffsetDateTime;
76
import java.util.Optional;
87
import java.util.concurrent.TimeoutException;
@@ -12,6 +11,7 @@
1211
import org.springframework.data.domain.PageRequest;
1312
import org.sterl.spring.persistent_tasks.AbstractSpringTest;
1413
import org.sterl.spring.persistent_tasks.AbstractSpringTest.TaskConfig.Task3;
14+
import org.sterl.spring.persistent_tasks.PersistentTaskService;
1515
import org.sterl.spring.persistent_tasks.api.AddTriggerRequest;
1616
import org.sterl.spring.persistent_tasks.api.TriggerStatus;
1717
import org.sterl.spring.persistent_tasks.trigger.model.TriggerEntity;
@@ -20,6 +20,8 @@ class HistoryServiceTest extends AbstractSpringTest {
2020

2121
@Autowired
2222
private HistoryService subject;
23+
@Autowired
24+
private PersistentTaskService persistentTaskService;
2325

2426
@Test
2527
void testReQueueTrigger() {
@@ -35,7 +37,7 @@ void testReQueueTrigger() {
3537
// THEN
3638
assertThat(t).isPresent();
3739
// AND
38-
persistentTaskService.executeTriggersAndWait(Duration.ofSeconds(2));
40+
persistentTaskTestService.runNextTrigger();
3941
asserts.assertValue(Task3.NAME + "::Hallo");
4042
// AND
4143
assertThat(subject.countTriggers(trigger.getKey())).isEqualTo(2);
@@ -46,7 +48,7 @@ void testTriggerHistory() throws TimeoutException, InterruptedException {
4648
// GIVEN
4749
final var trigger = Task3.ID.newUniqueTrigger("Hallo");
4850
triggerService.queue(trigger);
49-
persistentTaskService.executeTriggersAndWait(Duration.ofSeconds(2));
51+
persistentTaskTestService.runNextTrigger();
5052
// WHEN
5153
var triggers = subject.findAllDetailsForKey(trigger.key(), PageRequest.of(0, 100)).getContent();
5254

core/src/test/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerServiceTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99

1010
import org.junit.jupiter.api.BeforeEach;
1111
import org.junit.jupiter.api.Test;
12+
import org.springframework.beans.factory.annotation.Autowired;
1213
import org.sterl.spring.persistent_tasks.AbstractSpringTest;
1314
import org.sterl.spring.persistent_tasks.AbstractSpringTest.TaskConfig.Task3;
15+
import org.sterl.spring.persistent_tasks.PersistentTaskService;
1416
import org.sterl.spring.persistent_tasks.api.AddTriggerRequest;
1517
import org.sterl.spring.persistent_tasks.api.TaskId;
1618
import org.sterl.spring.persistent_tasks.api.TaskId.TriggerBuilder;
@@ -21,6 +23,8 @@
2123
class SchedulerServiceTest extends AbstractSpringTest {
2224

2325
private SchedulerService subject;
26+
@Autowired
27+
private PersistentTaskService persistentTaskService;
2428

2529
@BeforeEach
2630
public void beforeEach() throws Exception {
@@ -99,7 +103,8 @@ void testRunOrQueue() throws Exception {
99103
// THEN
100104
assertThat(subject.getScheduler().getRunnungTasks()).isOne();
101105
// AND
102-
awaitRunningTasks();
106+
persistentTaskTestService.scheduleNextTriggersAndWait(Duration.ofSeconds(3));
107+
103108
assertThat(persistentTaskService.getLastTriggerData(ref).get().getStatus())
104109
.isEqualTo(TriggerStatus.SUCCESS);
105110
asserts.assertValue(Task3.NAME + "::Hallo");
@@ -115,8 +120,7 @@ void testQueuedInFuture() throws TimeoutException, InterruptedException {
115120
subject.runOrQueue(triggerRequest);
116121

117122
// WHEN
118-
persistentTaskService.executeTriggersAndWait(Duration.ofSeconds(2));
119-
awaitRunningTasks();
123+
persistentTaskTestService.scheduleNextTriggersAndWait(Duration.ofSeconds(3));
120124

121125
// THEN
122126
asserts.assertMissing(Task3.NAME + "::Hallo");
@@ -132,7 +136,7 @@ void runSimpleTaskMultipleTimesTest() throws Exception {
132136
}
133137

134138
// WHEN
135-
persistentTaskService.executeTriggersAndWait(Duration.ofSeconds(2));
139+
persistentTaskTestService.runAllDueTrigger(OffsetDateTime.now());
136140

137141
// THEN
138142
for (int i = 1; i < 21; ++i) {

0 commit comments

Comments
 (0)