Skip to content

Commit 5f4a277

Browse files
authored
feat: Add multi-server test using the replicated queue manager. (#380)
1 parent dcbc1ad commit 5f4a277

File tree

26 files changed

+1097
-8
lines changed

26 files changed

+1097
-8
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,4 @@ nbproject/
4848
# Private Claude config
4949
.claude/
5050
.serena/
51+
claudedocs

extras/queue-manager-replicated/pom.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
<modules>
1919
<module>core</module>
2020
<module>replication-mp-reactive</module>
21-
<module>tests</module>
21+
<module>tests-single-instance</module>
22+
<module>tests-multi-instance</module>
2223
</modules>
2324

2425
</project>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>io.github.a2asdk</groupId>
9+
<artifactId>a2a-java-queue-manager-replicated-parent</artifactId>
10+
<version>0.3.0.Beta3-SNAPSHOT</version>
11+
<relativePath>../pom.xml</relativePath>
12+
</parent>
13+
14+
<artifactId>a2a-java-queue-manager-replicated-tests-multi-instance-parent</artifactId>
15+
<packaging>pom</packaging>
16+
<name>Java A2A Extras: Replicated Queue Manager Tests - Multi Instance Parent</name>
17+
18+
<modules>
19+
<module>quarkus-common</module>
20+
<module>quarkus-app-1</module>
21+
<module>quarkus-app-2</module>
22+
<module>tests</module>
23+
</modules>
24+
25+
</project>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
FROM openjdk:17-slim
2+
3+
WORKDIR /app
4+
5+
# Copy the built Quarkus application
6+
COPY target/quarkus-app/lib/ /app/lib/
7+
COPY target/quarkus-app/*.jar /app/
8+
COPY target/quarkus-app/app/ /app/app/
9+
COPY target/quarkus-app/quarkus/ /app/quarkus/
10+
11+
EXPOSE 8081
12+
13+
CMD ["java", "-jar", "/app/quarkus-run.jar"]
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>io.github.a2asdk</groupId>
9+
<artifactId>a2a-java-queue-manager-replicated-tests-multi-instance-parent</artifactId>
10+
<version>0.3.0.Beta3-SNAPSHOT</version>
11+
<relativePath>../pom.xml</relativePath>
12+
</parent>
13+
14+
<artifactId>a2a-java-queue-manager-replicated-tests-multi-instance-app-1</artifactId>
15+
<name>Java A2A Extras: Replicated Queue Manager Tests - Multi Instance App 1</name>
16+
17+
<dependencies>
18+
<!-- Common test code -->
19+
<dependency>
20+
<groupId>io.github.a2asdk</groupId>
21+
<artifactId>a2a-java-queue-manager-replicated-tests-multi-instance-common</artifactId>
22+
<version>${project.version}</version>
23+
</dependency>
24+
25+
<!-- Replicated Queue Manager -->
26+
<dependency>
27+
<groupId>io.github.a2asdk</groupId>
28+
<artifactId>a2a-java-queue-manager-replicated-core</artifactId>
29+
<version>${project.version}</version>
30+
</dependency>
31+
<dependency>
32+
<groupId>io.github.a2asdk</groupId>
33+
<artifactId>a2a-java-queue-manager-replication-mp-reactive</artifactId>
34+
<version>${project.version}</version>
35+
</dependency>
36+
37+
<!-- A2A Reference Implementation -->
38+
<dependency>
39+
<groupId>io.github.a2asdk</groupId>
40+
<artifactId>a2a-java-sdk-reference-jsonrpc</artifactId>
41+
</dependency>
42+
43+
<!-- JPA TaskStore for shared database -->
44+
<dependency>
45+
<groupId>io.github.a2asdk</groupId>
46+
<artifactId>a2a-java-extras-task-store-database-jpa</artifactId>
47+
<version>${project.version}</version>
48+
</dependency>
49+
<dependency>
50+
<groupId>io.quarkus</groupId>
51+
<artifactId>quarkus-jdbc-postgresql</artifactId>
52+
</dependency>
53+
<dependency>
54+
<groupId>io.quarkus</groupId>
55+
<artifactId>quarkus-hibernate-orm</artifactId>
56+
</dependency>
57+
58+
<!-- Kafka Messaging -->
59+
<dependency>
60+
<groupId>io.quarkus</groupId>
61+
<artifactId>quarkus-messaging-kafka</artifactId>
62+
</dependency>
63+
64+
<!-- Health Check -->
65+
<dependency>
66+
<groupId>io.quarkus</groupId>
67+
<artifactId>quarkus-smallrye-health</artifactId>
68+
</dependency>
69+
70+
<!-- CDI -->
71+
<dependency>
72+
<groupId>jakarta.enterprise</groupId>
73+
<artifactId>jakarta.enterprise.cdi-api</artifactId>
74+
<scope>provided</scope>
75+
</dependency>
76+
</dependencies>
77+
78+
<build>
79+
<plugins>
80+
<plugin>
81+
<groupId>io.quarkus</groupId>
82+
<artifactId>quarkus-maven-plugin</artifactId>
83+
<extensions>true</extensions>
84+
<executions>
85+
<execution>
86+
<goals>
87+
<goal>build</goal>
88+
</goals>
89+
</execution>
90+
</executions>
91+
</plugin>
92+
</plugins>
93+
</build>
94+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.a2a.extras.queuemanager.replicated.tests.multiinstance.app1;
2+
3+
import jakarta.enterprise.context.ApplicationScoped;
4+
import jakarta.enterprise.inject.Produces;
5+
6+
import io.a2a.extras.queuemanager.replicated.tests.multiinstance.common.MultiInstanceReplicationAgentCards;
7+
import io.a2a.server.PublicAgentCard;
8+
import io.a2a.spec.AgentCard;
9+
10+
@ApplicationScoped
11+
public class MultiInstanceReplicationApp1AgentCardProducer {
12+
13+
@Produces
14+
@PublicAgentCard
15+
public AgentCard agentCard() {
16+
return MultiInstanceReplicationAgentCards.createAgentCard(1, 8081);
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.a2a.extras.queuemanager.replicated.tests.multiinstance.app1;
2+
3+
import jakarta.enterprise.context.ApplicationScoped;
4+
import jakarta.enterprise.inject.Produces;
5+
6+
import io.a2a.extras.queuemanager.replicated.tests.multiinstance.common.MultiInstanceReplicationAgentExecutor;
7+
import io.a2a.server.agentexecution.AgentExecutor;
8+
9+
@ApplicationScoped
10+
public class MultiInstanceReplicationApp1AgentExecutorProducer {
11+
12+
@Produces
13+
public AgentExecutor agentExecutor() {
14+
return new MultiInstanceReplicationAgentExecutor();
15+
}
16+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Application HTTP Port
2+
quarkus.http.port=8081
3+
4+
# Select our ReplicatedQueueManager and JpaDatabaseTaskStore as the active implementations
5+
quarkus.arc.selected-alternatives=io.a2a.extras.queuemanager.replicated.core.ReplicatedQueueManager,io.a2a.extras.taskstore.database.jpa.JpaDatabaseTaskStore
6+
7+
# Configure PostgreSQL database (connection details will be provided by Testcontainers)
8+
quarkus.datasource."a2a-java".db-kind=postgresql
9+
quarkus.datasource."a2a-java".jdbc.url=${DATABASE_URL:jdbc:postgresql://localhost:5432/a2adb}
10+
quarkus.datasource."a2a-java".username=${DATABASE_USER:a2auser}
11+
quarkus.datasource."a2a-java".password=${DATABASE_PASSWORD:a2apass}
12+
quarkus.hibernate-orm."a2a-java".datasource=a2a-java
13+
quarkus.hibernate-orm."a2a-java".database.generation=drop-and-create
14+
quarkus.hibernate-orm."a2a-java".packages=io.a2a.extras.taskstore.database.jpa
15+
16+
# Configure the outgoing channel (QueueManager -> Kafka)
17+
mp.messaging.outgoing.replicated-events-out.connector=smallrye-kafka
18+
mp.messaging.outgoing.replicated-events-out.topic=replicated-events
19+
mp.messaging.outgoing.replicated-events-out.value.serializer=org.apache.kafka.common.serialization.StringSerializer
20+
mp.messaging.outgoing.replicated-events-out.bootstrap.servers=${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
21+
22+
# Configure the incoming channel (Kafka -> QueueManager)
23+
mp.messaging.incoming.replicated-events-in.connector=smallrye-kafka
24+
mp.messaging.incoming.replicated-events-in.topic=replicated-events
25+
mp.messaging.incoming.replicated-events-in.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
26+
mp.messaging.incoming.replicated-events-in.bootstrap.servers=${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
27+
mp.messaging.incoming.replicated-events-in.group.id=app-1-consumer-group
28+
mp.messaging.incoming.replicated-events-in.auto.offset.reset=earliest
29+
30+
# Disable DevServices - Testcontainers will manage infrastructure
31+
quarkus.devservices.enabled=false
32+
quarkus.kafka.devservices.enabled=false
33+
34+
# Reduce timeouts for faster tests
35+
quarkus.messaging.kafka.health.timeout=5s
36+
37+
# Enable debug logging
38+
quarkus.log.category."io.a2a.server.events".level=DEBUG
39+
quarkus.log.category."io.a2a.server.requesthandlers".level=DEBUG
40+
quarkus.log.category."io.a2a.extras.queuemanager.replicated".level=DEBUG
41+
quarkus.log.category."io.a2a.client".level=DEBUG
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
FROM openjdk:17-slim
2+
3+
WORKDIR /app
4+
5+
# Copy the built Quarkus application
6+
COPY target/quarkus-app/lib/ /app/lib/
7+
COPY target/quarkus-app/*.jar /app/
8+
COPY target/quarkus-app/app/ /app/app/
9+
COPY target/quarkus-app/quarkus/ /app/quarkus/
10+
11+
EXPOSE 8082
12+
13+
CMD ["java", "-jar", "/app/quarkus-run.jar"]
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>io.github.a2asdk</groupId>
9+
<artifactId>a2a-java-queue-manager-replicated-tests-multi-instance-parent</artifactId>
10+
<version>0.3.0.Beta3-SNAPSHOT</version>
11+
<relativePath>../pom.xml</relativePath>
12+
</parent>
13+
14+
<artifactId>a2a-java-queue-manager-replicated-tests-multi-instance-app-2</artifactId>
15+
<name>Java A2A Extras: Replicated Queue Manager Tests - Multi Instance App 2</name>
16+
17+
<dependencies>
18+
<!-- Common test code -->
19+
<dependency>
20+
<groupId>io.github.a2asdk</groupId>
21+
<artifactId>a2a-java-queue-manager-replicated-tests-multi-instance-common</artifactId>
22+
<version>${project.version}</version>
23+
</dependency>
24+
25+
<!-- Replicated Queue Manager -->
26+
<dependency>
27+
<groupId>io.github.a2asdk</groupId>
28+
<artifactId>a2a-java-queue-manager-replicated-core</artifactId>
29+
<version>${project.version}</version>
30+
</dependency>
31+
<dependency>
32+
<groupId>io.github.a2asdk</groupId>
33+
<artifactId>a2a-java-queue-manager-replication-mp-reactive</artifactId>
34+
<version>${project.version}</version>
35+
</dependency>
36+
37+
<!-- A2A Reference Implementation -->
38+
<dependency>
39+
<groupId>io.github.a2asdk</groupId>
40+
<artifactId>a2a-java-sdk-reference-jsonrpc</artifactId>
41+
</dependency>
42+
43+
<!-- JPA TaskStore for shared database -->
44+
<dependency>
45+
<groupId>io.github.a2asdk</groupId>
46+
<artifactId>a2a-java-extras-task-store-database-jpa</artifactId>
47+
<version>${project.version}</version>
48+
</dependency>
49+
<dependency>
50+
<groupId>io.quarkus</groupId>
51+
<artifactId>quarkus-jdbc-postgresql</artifactId>
52+
</dependency>
53+
<dependency>
54+
<groupId>io.quarkus</groupId>
55+
<artifactId>quarkus-hibernate-orm</artifactId>
56+
</dependency>
57+
58+
<!-- Kafka Messaging -->
59+
<dependency>
60+
<groupId>io.quarkus</groupId>
61+
<artifactId>quarkus-messaging-kafka</artifactId>
62+
</dependency>
63+
64+
<!-- Health Check -->
65+
<dependency>
66+
<groupId>io.quarkus</groupId>
67+
<artifactId>quarkus-smallrye-health</artifactId>
68+
</dependency>
69+
70+
<!-- CDI -->
71+
<dependency>
72+
<groupId>jakarta.enterprise</groupId>
73+
<artifactId>jakarta.enterprise.cdi-api</artifactId>
74+
<scope>provided</scope>
75+
</dependency>
76+
</dependencies>
77+
78+
<build>
79+
<plugins>
80+
<plugin>
81+
<groupId>io.quarkus</groupId>
82+
<artifactId>quarkus-maven-plugin</artifactId>
83+
<extensions>true</extensions>
84+
<executions>
85+
<execution>
86+
<goals>
87+
<goal>build</goal>
88+
</goals>
89+
</execution>
90+
</executions>
91+
</plugin>
92+
</plugins>
93+
</build>
94+
</project>

0 commit comments

Comments
 (0)