DBZ-8135 Implementation of in-process signal channel
This commit is contained in:
parent
40114d1219
commit
c7b8940691
@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright Debezium Authors.
|
||||
*
|
||||
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
|
||||
*/
|
||||
package io.debezium.pipeline.signal.channels.process;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import io.debezium.DebeziumException;
|
||||
import io.debezium.annotation.ThreadSafe;
|
||||
import io.debezium.config.CommonConnectorConfig;
|
||||
import io.debezium.pipeline.signal.SignalRecord;
|
||||
import io.debezium.pipeline.signal.channels.SignalChannelReader;
|
||||
|
||||
/**
|
||||
* Implementation of {@link SignalChannelReader} that also implements {@link SignalChannelWriter}
|
||||
* used for sending signal from the same JVM process
|
||||
*
|
||||
* <p>
|
||||
* Mainly targeted at Debezium Engine
|
||||
* </p>
|
||||
*/
|
||||
@ThreadSafe
|
||||
public class InProcessSignalChannel implements SignalChannelReader, SignalChannelWriter {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(InProcessSignalChannel.class);
|
||||
public static final String CHANNEL_NAME = "in-process";
|
||||
|
||||
private final AtomicBoolean open = new AtomicBoolean(false);
|
||||
private final Queue<SignalRecord> signals = new ConcurrentLinkedQueue<>();
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return CHANNEL_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(CommonConnectorConfig connectorConfig) {
|
||||
open.compareAndSet(false, true);
|
||||
LOGGER.info("Reading signals from {} channel", CHANNEL_NAME);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SignalRecord> read() {
|
||||
return Stream.ofNullable(signals.poll()).toList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
if (open.compareAndSet(true, false)) {
|
||||
drain();
|
||||
}
|
||||
}
|
||||
|
||||
private void drain() {
|
||||
while (!signals.isEmpty()) {
|
||||
signals.clear();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void signal(SignalRecord signal) {
|
||||
if (!open.get()) {
|
||||
throw new DebeziumException("Channel already closed");
|
||||
}
|
||||
signals.add(signal);
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright Debezium Authors.
|
||||
*
|
||||
* Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
|
||||
*/
|
||||
package io.debezium.pipeline.signal.channels.process;
|
||||
|
||||
import io.debezium.pipeline.signal.SignalRecord;
|
||||
|
||||
/**
|
||||
* Interface for writing signals to a channel.
|
||||
*/
|
||||
public interface SignalChannelWriter {
|
||||
void signal(SignalRecord signal);
|
||||
}
|
@ -2,3 +2,4 @@ io.debezium.pipeline.signal.channels.SourceSignalChannel
|
||||
io.debezium.pipeline.signal.channels.KafkaSignalChannel
|
||||
io.debezium.pipeline.signal.channels.FileSignalChannel
|
||||
io.debezium.pipeline.signal.channels.jmx.JmxSignalChannel
|
||||
io.debezium.pipeline.signal.channels.process.InProcessSignalChannel
|
Loading…
Reference in New Issue
Block a user