+ * This method may be called by multiple threads concurrently and thus MUST be thread safe!
+ *
+ * @param records Batch of {@link ConsumerRecord}s to process
+ * @throws ProcessingException When consuming the batch of {@link ConsumerRecord}s failed
+ */
+ void process(final List
+ * This method may be called by multiple threads concurrently and thus MUST be thread safe!
+ *
+ * @param record The {@link ConsumerRecord} to process
+ * @throws ProcessingException When processing the {@link ConsumerRecord} failed
+ */
+ void process(final ConsumerRecord
+ * Due to how Alpine's {@link Config} is resolved, {@link Processor} names must have a specific
+ * format in order to be able to resolve properties for them.
+ *
+ * @param name The {@link Processor} name to validate.
+ */
+ private static void requireValidProcessorName(final String name) {
+ if (name == null) {
+ throw new IllegalArgumentException("name must not be null");
+ }
+ if (!PROCESSOR_NAME_PATTERN.matcher(name).matches()) {
+ throw new IllegalArgumentException("name is invalid; names must match the regular expression %s"
+ .formatted(PROCESSOR_NAME_PATTERN.pattern()));
+ }
+ }
+
+ private static IntervalFunction getRetryIntervalFunction(final Map