Skip to content

Commit d9f3331

Browse files
yuanglilikmos
authored andcommitted
debezium/dbz#2026 Support multiengine in QuarkusHeartbeatEmitter
Signed-off-by: nonononoonononon <yuangli971@gmail.com>
1 parent 12b593f commit d9f3331

2 files changed

Lines changed: 37 additions & 9 deletions

File tree

debezium-quarkus-parent/debezium-quarkus-engine-parent/runtime/src/main/java/io/quarkus/debezium/heartbeat/QuarkusHeartbeatEmitter.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,18 @@ public QuarkusHeartbeatEmitter(List<DebeziumConnectorRegistry> registries, Event
4949

5050
@Override
5151
public void emit(Map<String, ?> partition, OffsetContext offset) {
52-
DefaultEngine.Literal.selectDefault(heartbeat.select(Engine.Literal.of(context().manifest().id())),
53-
context().manifest())
54-
.fire(new DebeziumHeartbeat(
55-
this.registries.getFirst().engines().getFirst().connector(),
56-
this.registries.getFirst().engines().getFirst().status(),
57-
partition,
58-
offset.getOffset()));
52+
this.registries
53+
.stream()
54+
.flatMap(registry -> registry.engines().stream())
55+
.filter(engine -> engine.manifest().equals(context().manifest()))
56+
.map(engine -> Map.entry(engine, DefaultEngine.Literal.selectDefault(
57+
heartbeat.select(Engine.Literal.of(engine.manifest().id())), engine.manifest())))
58+
.forEach(entry -> entry.getValue().fire(
59+
new DebeziumHeartbeat(
60+
entry.getKey().connector(),
61+
entry.getKey().status(),
62+
partition,
63+
offset.getOffset())));
5964
}
6065

6166
@Override

debezium-quarkus-parent/debezium-quarkus-engine-parent/runtime/src/test/java/io/quarkus/debezium/heartbeat/QuarkusHeartbeatEmitterTest.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
package io.quarkus.debezium.heartbeat;
88

99
import static org.mockito.ArgumentMatchers.any;
10+
import static org.mockito.Mockito.never;
1011
import static org.mockito.Mockito.verify;
1112
import static org.mockito.Mockito.when;
1213

1314
import java.time.Instant;
1415
import java.util.Collections;
16+
import java.util.List;
1517
import java.util.Map;
1618

1719
import jakarta.enterprise.event.Event;
@@ -60,7 +62,28 @@ void shouldFireEventWhenCalled() {
6062
verify(event).fire(new DebeziumHeartbeat(CONNECTOR, DEBEZIUM_STATUS, PARTITION, Map.of("offset", "value")));
6163
}
6264

65+
@Test
66+
@DisplayName("should only fire event for the engine matching the current thread context")
67+
void shouldOnlyFireForEngineMatchingContext() {
68+
Connector otherConnector = new Connector("other.connector");
69+
DebeziumStatus otherStatus = new DebeziumStatus(DebeziumStatus.State.CREATING);
70+
71+
Debezium matching = generate("testing", DEBEZIUM_STATUS, CONNECTOR);
72+
Debezium other = generate("alternative", otherStatus, otherConnector);
73+
74+
when(registry.engines()).thenReturn(List.of(matching, other));
75+
76+
underTest.emit(PARTITION, OFFSET);
77+
78+
verify(event).fire(new DebeziumHeartbeat(CONNECTOR, DEBEZIUM_STATUS, PARTITION, Map.of("offset", "value")));
79+
verify(event, never()).fire(new DebeziumHeartbeat(otherConnector, otherStatus, PARTITION, Map.of("offset", "value")));
80+
}
81+
6382
public Debezium generate(DebeziumStatus status) {
83+
return generate("testing", status, CONNECTOR);
84+
}
85+
86+
public Debezium generate(String manifestId, DebeziumStatus status, Connector connector) {
6487
return new Debezium() {
6588
@Override
6689
public DebeziumEngine.Signaler signaler() {
@@ -79,12 +102,12 @@ public DebeziumStatus status() {
79102

80103
@Override
81104
public Connector connector() {
82-
return CONNECTOR;
105+
return connector;
83106
}
84107

85108
@Override
86109
public EngineManifest manifest() {
87-
return null;
110+
return new EngineManifest(manifestId);
88111
}
89112
};
90113
}

0 commit comments

Comments
 (0)