Skip to content

Commit b41369e

Browse files
feat: implement JpaIdempotencyRegistry [WIP]
1 parent 6a88ace commit b41369e

File tree

33 files changed

+539
-99
lines changed

33 files changed

+539
-99
lines changed

idempotency-registry-jpa/pom.xml

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<parent>
5+
<groupId>dev.bpm-crafters.process-engine-worker</groupId>
6+
<artifactId>process-engine-worker-root</artifactId>
7+
<version>0.7.2-SNAPSHOT</version>
8+
<relativePath>../pom.xml</relativePath>
9+
</parent>
10+
11+
<artifactId>process-engine-worker-idempotency-registry-jpa</artifactId>
12+
<name>${project.artifactId}</name>
13+
14+
<dependencyManagement>
15+
<dependencies>
16+
<dependency>
17+
<groupId>org.springframework.boot</groupId>
18+
<artifactId>spring-boot-dependencies</artifactId>
19+
<version>${spring-boot.version}</version>
20+
<scope>import</scope>
21+
<type>pom</type>
22+
</dependency>
23+
</dependencies>
24+
</dependencyManagement>
25+
26+
<dependencies>
27+
<dependency>
28+
<groupId>${project.groupId}</groupId>
29+
<artifactId>process-engine-worker-spring-boot-starter</artifactId>
30+
<version>${project.version}</version>
31+
</dependency>
32+
<dependency>
33+
<groupId>org.springframework.boot</groupId>
34+
<artifactId>spring-boot-starter-data-jpa</artifactId>
35+
</dependency>
36+
37+
<!-- Testing -->
38+
<dependency>
39+
<groupId>${project.groupId}</groupId>
40+
<artifactId>process-engine-worker-integration-test-boilerplate</artifactId>
41+
<version>${project.version}</version>
42+
<scope>test</scope>
43+
</dependency>
44+
</dependencies>
45+
46+
<build>
47+
<plugins>
48+
<plugin>
49+
<groupId>org.jetbrains.kotlin</groupId>
50+
<artifactId>kotlin-maven-plugin</artifactId>
51+
<configuration>
52+
<compilerPlugins>
53+
<plugin>jpa</plugin>
54+
<plugin>spring</plugin>
55+
</compilerPlugins>
56+
</configuration>
57+
<executions>
58+
<execution>
59+
<id>kapt</id>
60+
<goals>
61+
<goal>kapt</goal>
62+
</goals>
63+
<configuration>
64+
<annotationProcessorPaths>
65+
<annotationProcessorPath>
66+
<groupId>org.springframework.boot</groupId>
67+
<artifactId>spring-boot-configuration-processor</artifactId>
68+
<version>${spring-boot.version}</version>
69+
</annotationProcessorPath>
70+
</annotationProcessorPaths>
71+
</configuration>
72+
</execution>
73+
</executions>
74+
</plugin>
75+
</plugins>
76+
</build>
77+
78+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package dev.bpmcrafters.processengine.worker.configuration
2+
3+
import dev.bpmcrafters.processengine.worker.idempotency.IdempotencyRegistry
4+
import dev.bpmcrafters.processengine.worker.idempotency.JpaIdempotencyRegistry
5+
import jakarta.persistence.EntityManager
6+
import org.springframework.context.annotation.Bean
7+
import org.springframework.context.annotation.Configuration
8+
9+
/**
10+
* @since 0.8.0
11+
*/
12+
@Configuration
13+
class JpaIdempotencyAutoConfiguration {
14+
15+
@Bean
16+
fun idempotencyRegistry(entityManager: EntityManager): IdempotencyRegistry = JpaIdempotencyRegistry(entityManager)
17+
18+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package dev.bpmcrafters.processengine.worker.idempotency
2+
3+
import dev.bpmcrafters.processengineapi.CommonRestrictions
4+
import dev.bpmcrafters.processengineapi.task.TaskInformation
5+
import jakarta.persistence.EntityManager
6+
import java.time.Clock
7+
8+
class JpaIdempotencyRegistry(val entityManager: EntityManager) : IdempotencyRegistry {
9+
10+
override fun register(taskInformation: TaskInformation, result: Map<String, Any?>) {
11+
entityManager.persist(TaskLogEntry(
12+
taskInformation.taskId,
13+
taskInformation.meta[CommonRestrictions.PROCESS_INSTANCE_ID] as String,
14+
Clock.systemUTC().instant(),
15+
result
16+
))
17+
}
18+
19+
override fun getTaskResult(taskInformation: TaskInformation): Map<String, Any?>? = entityManager
20+
.find(TaskLogEntry::class.java, taskInformation.taskId)
21+
?.result
22+
23+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package dev.bpmcrafters.processengine.worker.idempotency
2+
3+
import jakarta.persistence.AttributeConverter
4+
import jakarta.persistence.Converter
5+
import java.io.ByteArrayInputStream
6+
import java.io.ByteArrayOutputStream
7+
import java.io.ObjectInputStream
8+
import java.io.ObjectOutputStream
9+
10+
@Converter(autoApply = false)
11+
class MapConverter : AttributeConverter<Map<String, Any?>, ByteArray> {
12+
13+
override fun convertToDatabaseColumn(attribute: Map<String, Any?>?): ByteArray? {
14+
if (attribute == null) {
15+
return null
16+
}
17+
ByteArrayOutputStream().use {
18+
ObjectOutputStream(it).writeObject(attribute)
19+
return it.toByteArray()
20+
}
21+
}
22+
23+
override fun convertToEntityAttribute(dbData: ByteArray?): Map<String, Any?>? {
24+
if (dbData == null) {
25+
return null
26+
}
27+
return ObjectInputStream(ByteArrayInputStream(dbData)).readObject() as Map<String, Any?>
28+
}
29+
30+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package dev.bpmcrafters.processengine.worker.idempotency
2+
3+
import jakarta.persistence.*
4+
import java.time.Instant
5+
6+
@Entity
7+
@Table(name = "task_log_entry_")
8+
class TaskLogEntry(
9+
@Id
10+
@Column(name = "task_id_", nullable = false, length = 100)
11+
val taskId: String,
12+
@Column(name = "process_instance_id_", nullable = false, length = 100)
13+
val processInstanceId: String,
14+
@Column(name = "created_at_", nullable = false)
15+
val createdAt: Instant,
16+
@Column(name = "result_", nullable = false)
17+
@Lob
18+
@Convert(converter = MapConverter::class)
19+
val result: Map<String, Any?>
20+
) {
21+
22+
override fun toString(): String {
23+
return "TaskLogEntry(taskId='$taskId', processInstanceId='$processInstanceId', createdAt=$createdAt, result=$result)"
24+
}
25+
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
dev.bpmcrafters.processengine.worker.configuration.JpaIdempotencyAutoConfiguration

spring-boot-starter/src/test/kotlin/dev/bpmcrafters/processengine/worker/itest/camunda7/external/IdempotencyWithTransactionTest.kt renamed to idempotency-registry-jpa/src/test/kotlin/dev/bpmcrafters/processengine/worker/itest/camunda7/external/IdempotencyWithTransactionTest.kt

File renamed without changes.
Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<parent>
5+
<groupId>dev.bpm-crafters.process-engine-worker</groupId>
6+
<artifactId>process-engine-worker-root</artifactId>
7+
<version>0.7.2-SNAPSHOT</version>
8+
<relativePath>../pom.xml</relativePath>
9+
</parent>
10+
11+
<artifactId>process-engine-worker-integration-test-boilerplate</artifactId>
12+
<name>${project.artifactId}</name>
13+
14+
<dependencyManagement>
15+
<dependencies>
16+
<dependency>
17+
<groupId>org.assertj</groupId>
18+
<artifactId>assertj-core</artifactId>
19+
<version>${assertj.version}</version>
20+
</dependency>
21+
<dependency>
22+
<groupId>org.mockito.kotlin</groupId>
23+
<artifactId>mockito-kotlin</artifactId>
24+
<version>${mockito.version}</version>
25+
</dependency>
26+
<dependency>
27+
<groupId>org.testcontainers</groupId>
28+
<artifactId>testcontainers-bom</artifactId>
29+
<version>2.0.3</version>
30+
<scope>import</scope>
31+
<type>pom</type>
32+
</dependency>
33+
<dependency>
34+
<groupId>org.springframework.boot</groupId>
35+
<artifactId>spring-boot-dependencies</artifactId>
36+
<version>${spring-boot.version}</version>
37+
<scope>import</scope>
38+
<type>pom</type>
39+
</dependency>
40+
</dependencies>
41+
</dependencyManagement>
42+
43+
<dependencies>
44+
<dependency>
45+
<groupId>${project.groupId}</groupId>
46+
<artifactId>process-engine-worker-spring-boot-starter</artifactId>
47+
<version>${project.version}</version>
48+
</dependency>
49+
<dependency>
50+
<groupId>com.fasterxml.jackson.core</groupId>
51+
<artifactId>jackson-databind</artifactId>
52+
</dependency>
53+
<dependency>
54+
<groupId>com.fasterxml.jackson.datatype</groupId>
55+
<artifactId>jackson-datatype-jdk8</artifactId>
56+
</dependency>
57+
<dependency>
58+
<groupId>com.fasterxml.jackson.datatype</groupId>
59+
<artifactId>jackson-datatype-jsr310</artifactId>
60+
</dependency>
61+
<dependency>
62+
<groupId>com.fasterxml.jackson.module</groupId>
63+
<artifactId>jackson-module-kotlin</artifactId>
64+
</dependency>
65+
<dependency>
66+
<groupId>dev.bpm-crafters.process-engine-adapters</groupId>
67+
<artifactId>process-engine-adapter-camunda-platform-c7-remote-spring-boot-starter</artifactId>
68+
<version>${process-engine-adapters-c7.version}</version>
69+
</dependency>
70+
<dependency>
71+
<groupId>io.holunda.c7</groupId>
72+
<artifactId>c7-rest-client-spring-boot-starter-feign</artifactId>
73+
<version>${c7.version}</version>
74+
</dependency>
75+
<dependency>
76+
<groupId>io.micrometer</groupId>
77+
<artifactId>micrometer-core</artifactId>
78+
</dependency>
79+
<!-- <dependency>-->
80+
<!-- <groupId>jakarta.transaction</groupId>-->
81+
<!-- <artifactId>jakarta.transaction-api</artifactId>-->
82+
<!-- </dependency>-->
83+
<dependency>
84+
<groupId>org.assertj</groupId>
85+
<artifactId>assertj-core</artifactId>
86+
</dependency>
87+
<dependency>
88+
<groupId>org.awaitility</groupId>
89+
<artifactId>awaitility-kotlin</artifactId>
90+
</dependency>
91+
<dependency>
92+
<groupId>org.camunda.bpm.springboot</groupId>
93+
<artifactId>camunda-bpm-spring-boot-starter-external-task-client</artifactId>
94+
<version>${camunda-bpm-spring-boot-starter-external-task-client.version}</version>
95+
</dependency>
96+
<dependency>
97+
<groupId>org.jetbrains.kotlin</groupId>
98+
<artifactId>kotlin-test-junit5</artifactId>
99+
</dependency>
100+
<dependency>
101+
<groupId>org.junit.jupiter</groupId>
102+
<artifactId>junit-jupiter</artifactId>
103+
</dependency>
104+
<dependency>
105+
<groupId>org.junit.jupiter</groupId>
106+
<artifactId>junit-jupiter-params</artifactId>
107+
</dependency>
108+
<dependency>
109+
<groupId>org.liquibase</groupId>
110+
<artifactId>liquibase-core</artifactId>
111+
</dependency>
112+
<dependency>
113+
<groupId>org.mockito.kotlin</groupId>
114+
<artifactId>mockito-kotlin</artifactId>
115+
</dependency>
116+
<dependency>
117+
<groupId>org.postgresql</groupId>
118+
<artifactId>postgresql</artifactId>
119+
</dependency>
120+
<!-- <dependency>-->
121+
<!-- <groupId>org.springframework</groupId>-->
122+
<!-- <artifactId>spring-aop</artifactId>-->
123+
<!-- </dependency>-->
124+
<dependency>
125+
<groupId>org.springframework</groupId>
126+
<artifactId>spring-beans</artifactId>
127+
</dependency>
128+
<dependency>
129+
<groupId>org.springframework</groupId>
130+
<artifactId>spring-context</artifactId>
131+
</dependency>
132+
<dependency>
133+
<groupId>org.springframework</groupId>
134+
<artifactId>spring-tx</artifactId>
135+
</dependency>
136+
<dependency>
137+
<groupId>org.springframework.boot</groupId>
138+
<artifactId>spring-boot-autoconfigure</artifactId>
139+
</dependency>
140+
<dependency>
141+
<groupId>org.springframework.boot</groupId>
142+
<artifactId>spring-boot-configuration-processor</artifactId>
143+
<optional>true</optional>
144+
</dependency>
145+
<dependency>
146+
<groupId>org.springframework.boot</groupId>
147+
<artifactId>spring-boot-starter-data-jpa</artifactId>
148+
</dependency>
149+
<dependency>
150+
<groupId>org.springframework.boot</groupId>
151+
<artifactId>spring-boot-starter-test</artifactId>
152+
</dependency>
153+
<dependency>
154+
<groupId>org.testcontainers</groupId>
155+
<artifactId>junit-jupiter</artifactId>
156+
</dependency>
157+
<dependency>
158+
<groupId>org.testcontainers</groupId>
159+
<artifactId>postgresql</artifactId>
160+
</dependency>
161+
</dependencies>
162+
163+
<build>
164+
<plugins>
165+
<plugin>
166+
<groupId>org.jetbrains.kotlin</groupId>
167+
<artifactId>kotlin-maven-plugin</artifactId>
168+
<configuration>
169+
<compilerPlugins>
170+
<plugin>jpa</plugin>
171+
<plugin>spring</plugin>
172+
</compilerPlugins>
173+
</configuration>
174+
<executions>
175+
<execution>
176+
<id>kapt</id>
177+
<goals>
178+
<goal>kapt</goal>
179+
</goals>
180+
<configuration>
181+
<annotationProcessorPaths>
182+
<annotationProcessorPath>
183+
<groupId>org.springframework.boot</groupId>
184+
<artifactId>spring-boot-configuration-processor</artifactId>
185+
<version>${spring-boot.version}</version>
186+
</annotationProcessorPath>
187+
</annotationProcessorPaths>
188+
</configuration>
189+
</execution>
190+
</executions>
191+
</plugin>
192+
<plugin>
193+
<groupId>org.apache.maven.plugins</groupId>
194+
<artifactId>maven-deploy-plugin</artifactId>
195+
<executions>
196+
<execution>
197+
<id>default-deploy</id>
198+
<phase>none</phase>
199+
</execution>
200+
</executions>
201+
</plugin>
202+
</plugins>
203+
</build>
204+
205+
</project>

spring-boot-starter/src/test/kotlin/dev/bpmcrafters/processengine/worker/TestHelper.kt renamed to integration-test-boilerplate/src/main/kotlin/dev/bpmcrafters/processengine/worker/TestHelper.kt

File renamed without changes.

spring-boot-starter/src/test/kotlin/dev/bpmcrafters/processengine/worker/itest/camunda7/external/AbstractBehaviorTest.kt renamed to integration-test-boilerplate/src/main/kotlin/dev/bpmcrafters/processengine/worker/itest/camunda7/external/AbstractBehaviorTest.kt

File renamed without changes.

0 commit comments

Comments
 (0)