Example output after the failure:
$ ./run.sh
Failed to load mandatory config value 'debezium.sink.type'. Please check you have correct Debezium server config in /home/vjuranek/tmp/debezium-server/conf/application.properties or required properties are defined via system or environment variables.
{"timestamp":"2022-08-08T13:37:35.848+02:00","sequence":155,"loggerClassName":"org.jboss.logging.Logger","loggerName":"io.quarkus.runtime.Application","level":"ERROR","message":"Failed to start application (with profile prod)","threadName":"main","threadId":1,"mdc":{},"ndc":"","hostName":"fedora","processName":"io.debezium.server.Main","processId":1048188,"exception":{"refId":1,"exceptionType":"java.util.NoSuchElementException","message":"SRCFG00014: The config property debezium.sink.type is required but it could not be found in any config source","frames":[{"class":"io.smallrye.config.SmallRyeConfig","method":"convertValue","line":282},{"class":"io.smallrye.config.SmallRyeConfig","method":"getValue","line":239},{"class":"io.smallrye.config.SmallRyeConfig","method":"getValue","line":167},{"class":"io.debezium.server.DebeziumServer","method":"start","line":104},{"class":"io.debezium.server.DebeziumServer_Bean","method":"create"},{"class":"io.debezium.server.DebeziumServer_Bean","method":"create"},{"class":"io.quarkus.arc.impl.AbstractSharedContext","method":"createInstanceHandle","line":111},{"class":"io.quarkus.arc.impl.AbstractSharedContext$1","method":"get","line":35},{"class":"io.quarkus.arc.impl.AbstractSharedContext$1","method":"get","line":32},{"class":"io.quarkus.arc.impl.LazyValue","method":"get","line":26},{"class":"io.quarkus.arc.impl.ComputingCache","method":"computeIfAbsent","line":69},{"class":"io.quarkus.arc.impl.AbstractSharedContext","method":"get","line":32},{"class":"io.quarkus.arc.impl.ClientProxies","method":"getApplicationScopedDelegate","line":19},{"class":"io.debezium.server.DebeziumServer_ClientProxy","method":"arc$delegate"},{"class":"io.debezium.server.DebeziumServer_ClientProxy","method":"arc_contextualInstance"},{"class":"io.debezium.server.DebeziumServer_Observer_Synthetic_d70cd75bf32ab6598217b9a64a8473d65e248c05","method":"notify"},{"class":"io.quarkus.arc.impl.EventImpl$Notifier","method":"notifyObservers","line":323},{"class":"io.quarkus.arc.impl.EventImpl$Notifier","method":"notify","line":305},{"class":"io.quarkus.arc.impl.EventImpl","method":"fire","line":73},{"class":"io.quarkus.arc.runtime.ArcRecorder","method":"fireLifecycleEvent","line":130},{"class":"io.quarkus.arc.runtime.ArcRecorder","method":"handleLifecycleEvents","line":99},{"class":"io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294","method":"deploy_0"},{"class":"io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294","method":"deploy"},{"class":"io.quarkus.runner.ApplicationImpl","method":"doStart"},{"class":"io.quarkus.runtime.Application","method":"start","line":101},{"class":"io.quarkus.runtime.ApplicationLifecycleManager","method":"run","line":103},{"class":"io.quarkus.runtime.Quarkus","method":"run","line":67},{"class":"io.quarkus.runtime.Quarkus","method":"run","line":41},{"class":"io.quarkus.runtime.Quarkus","method":"run","line":120},{"class":"io.debezium.server.Main","method":"main","line":15}]}}
In existing test we added all events in the loop which can lead into
adding one event multiple times and therefore failing the tests.
When test run alone, this probably never happen or it was very rare.
Now, when test runs with Debezium server already running, it fails more
often. Fix it by removing already added events from WireMock.
If sending record to HTTP consumer fails, retry sending couple of times
and fail eventually. Retrying immdiatelly usually have no effect,
therefore sleep some time between retries.
Intorduce new config option to `HttpChangeConsumer`:
* `retries` - number of retries before exception is throws
* `retry.interval.ms` - amount of time to sleep before next retry
Normally WireMock is reset after each test. However, as we run WireMock
as a container, it's not reset and we have to do so manully. Add
a method which resets WireMock by sending HTTP request.
Refactor HttpChangeConsumer and its test to prepare for further changes
in follow-up patch. Move sending of records into separate method. Also
assert events in the tests in dedicated method.
Add Debezium scripting and it's optional JSR 223 dependencies into
server distribution in `lib_opt` directory.
Add these jars into classpath when `ENABLE_DEBEZIUM_SCRIPTING` env.
variable is set to `true`. Otherwise scripting jars are not loaded.
Change event consumer may specify if is able to consume tombstones or
not. If the it's not, don't send them. However, connector configuration
takes precence and thus cunsumer capability is taken into account only
when `tombstones.on.delete` is not explicitely configured for the
connector.
Also fix debezium server - setting notifier has to be done once embedded
config already exists, not before it.