spring-cloud-stream-binder-kafka: Using DeadLetterPublishingRecoverer with DefaultAfterRollbackProcessor in transactional StreamListener does not commit offset

When using DeadLetterPublishingRecoverer with DefaultAfterRollbackProcessor the offset is not comitted even though the record is successfully published to the DLT.

package dk.digst.digital.post.kafka.retry;

import java.util.HashMap;
import java.util.Map;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.TopicPartition;
import org.apache.kafka.common.serialization.ByteArrayDeserializer;
import org.apache.kafka.common.serialization.ByteArraySerializer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.config.ListenerContainerCustomizer;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.context.annotation.Bean;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaOperations;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import org.springframework.kafka.listener.AbstractMessageListenerContainer;
import org.springframework.kafka.listener.ContainerProperties;
import org.springframework.kafka.listener.ContainerProperties.AckMode;
import org.springframework.kafka.listener.DeadLetterPublishingRecoverer;
import org.springframework.kafka.listener.DefaultAfterRollbackProcessor;
import org.springframework.kafka.transaction.KafkaTransactionManager;
import org.springframework.retry.annotation.EnableRetry;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.util.backoff.BackOff;
import org.springframework.util.backoff.FixedBackOff;

@SpringBootApplication(proxyBeanMethods = false)
@EnableTransactionManagement
@EnableKafka
@EnableRetry
@EnableBinding(Sink.class)
public class KafkaStreamsRetryApplication {

  public static void main(String[] args) {
    SpringApplication.run(KafkaStreamsRetryApplication.class, args);
  }

  @Bean
  public ProducerFactory<byte[], byte[]> producerFactory() {
    Map<String, Object> props = new HashMap<>();
    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);

    DefaultKafkaProducerFactory<byte[], byte[]> factory = new DefaultKafkaProducerFactory<>(props);
    factory.setTransactionIdPrefix("txPrefix.");

    return factory;
  }

  @Bean
  public ProducerFactory<byte[], byte[]> retryProducerFactory() {
    Map<String, Object> props = new HashMap<>();
    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);

    DefaultKafkaProducerFactory<byte[], byte[]> factory = new DefaultKafkaProducerFactory<>(props);
    factory.setTransactionIdPrefix("txRetryRecoverer.");

    return factory;
  }

  @Bean
  public KafkaTemplate<byte[], byte[]> kafkaTemplate() {
    return new KafkaTemplate<>(producerFactory());
  }

  @Bean
  public KafkaTemplate<byte[], byte[]> retryKafkaTemplate() {
    return new KafkaTemplate<>(retryProducerFactory());
  }

  @Bean
  public ListenerContainerCustomizer<AbstractMessageListenerContainer<byte[], byte[]>> listenerContainerCustomizer(
      KafkaTransactionManager<?, ?> kafkaTransactionManager,
      KafkaOperations<byte[], byte[]> retryKafkaTemplate) {
    return (container, dest, group) -> {
      SetupHelper.setContainerProps(container.getContainerProperties(), kafkaTransactionManager);
      container
          .setAfterRollbackProcessor(new DefaultAfterRollbackProcessor<>(
              new DeadLetterPublishingRecoverer(retryKafkaTemplate,
                  (cr, e) -> new TopicPartition(TopicNames.RETRY_1, -1)),
              new FixedBackOff(100L, 1L)));
    };
  }

  @Bean
  public ConsumerFactory<byte[], byte[]> retry1ConsumerFactory() {
    return new DefaultKafkaConsumerFactory<>(
        SetupHelper.createConsumerFactoryBaseProps(GroupNames.RETRY_1));
  }

  @Bean
  public ConsumerFactory<byte[], byte[]> retry2ConsumerFactory() {
    return new DefaultKafkaConsumerFactory<>(
        SetupHelper.createConsumerFactoryBaseProps(GroupNames.RETRY_2));
  }

  @Bean
  public ConcurrentKafkaListenerContainerFactory<byte[], byte[]> retry1KafkaListenerContainerFactory(
      KafkaTransactionManager<byte[], byte[]> kafkaTransactionManager,
      ConsumerFactory<byte[], byte[]> retry1ConsumerFactory,
      KafkaOperations<byte[], byte[]> retryKafkaTemplate) {

    ConcurrentKafkaListenerContainerFactory<byte[], byte[]> factory =
        new ConcurrentKafkaListenerContainerFactory<>();
    SetupHelper.configureFactory(factory, kafkaTransactionManager, retry1ConsumerFactory,
        retryKafkaTemplate, TopicNames.RETRY_2, new FixedBackOff(100L, 1L));

    return factory;
  }


  @Bean
  public ConcurrentKafkaListenerContainerFactory<byte[], byte[]> retry2KafkaListenerContainerFactory(
      KafkaTransactionManager<byte[], byte[]> kafkaTransactionManager,
      ConsumerFactory<byte[], byte[]> retry2ConsumerFactory,
      KafkaOperations<byte[], byte[]> retryKafkaTemplate) {

    ConcurrentKafkaListenerContainerFactory<byte[], byte[]> factory =
        new ConcurrentKafkaListenerContainerFactory<>();
    SetupHelper.configureFactory(factory, kafkaTransactionManager, retry2ConsumerFactory,
        retryKafkaTemplate, TopicNames.DLQ, new FixedBackOff(100L, 1L));

    return factory;
  }

  public static class SetupHelper {

    public static <K, V> void setContainerProps(ContainerProperties containerProperties,
        KafkaTransactionManager<K, V> kafkaTransactionManager) {
      containerProperties.setIdleEventInterval(60000L);
      containerProperties.setTransactionManager(kafkaTransactionManager);
      containerProperties.setAckMode(AckMode.RECORD);
      containerProperties.setDeliveryAttemptHeader(true);
    }

    public static <K, V> void configureFactory(
        ConcurrentKafkaListenerContainerFactory<K, V> factory,
        KafkaTransactionManager<K, V> kafkaTransactionManager,
        ConsumerFactory<K, V> consumerFactory, KafkaOperations<K, V> kafkaTemplate,
        String errorTopicName, BackOff backOff) {
      setContainerProps(factory.getContainerProperties(), kafkaTransactionManager);
      factory.setConsumerFactory(consumerFactory);
      DefaultAfterRollbackProcessor<K, V> afterRollbackProcessor =
          new DefaultAfterRollbackProcessor<>(new DeadLetterPublishingRecoverer(kafkaTemplate,
              (cr, e) -> new TopicPartition(errorTopicName, -1)), backOff);
      factory.setAfterRollbackProcessor(afterRollbackProcessor);
    }

    public static Map<String, Object> createConsumerFactoryBaseProps(String groupId) {
      Map<String, Object> props = new HashMap<>();
      props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
      props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
      props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, ByteArrayDeserializer.class);
      props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ByteArrayDeserializer.class);
      props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
      props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
      return props;
    }

  }

  public static class TopicNames {

    public static final String INPUT = "kafka_retry_store";

    public static final String OUTPUT = "kafka_retry_index";

    public static final String RETRY_1 = "kafka_retry_index_retry_1";

    public static final String RETRY_2 = "kafka_retry_index_retry_2";

    public static final String DLQ = "kafka_retry_index_dlq";
  }

  public static class GroupNames {

    public static final String INPUT = "input";

    public static final String RETRY_1 = "retry1";

    public static final String RETRY_2 = "retry2";

  }
}

application.properties

spring.kafka.bootstrap-servers=${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}

spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.enable-auto-commit=false
spring.kafka.consumer.properties.max.poll.records=${KAFKA_CONSUMER_MAX_POLL_RECORDS:10}
spring.kafka.consumer.properties.max.poll.interval.ms=${KAFKA_CONSUMER_MAX_POLL_INTERVAL_MS:180000}
spring.kafka.consumer.properties.heartbeat.interval.ms=${KAFKA_CONSUMER_HEARTBEAT_INTERVAL_MS:3000}
spring.kafka.consumer.properties.session.timeout.ms=${KAFKA_CONSUMER_SESSION_TIMEOUT_MS:10000}
spring.kafka.consumer.isolation-level=read-committed

spring.kafka.producer.transaction-id-prefix=${KAFKA_TRANSACTION_ID_PREFIX:${spring.application.name}.}
spring.kafka.producer.retries=10
spring.kafka.producer.acks=all
spring.kafka.producer.properties.enable.idempotence=true

spring.cloud.discovery.enabled=false

spring.cloud.stream.bindings.default.consumer.use-native-decoding=true      
spring.cloud.stream.bindings.default.producer.use-native-encoding=true
spring.cloud.stream.bindings.default.producer.auto-startup=true

spring.cloud.stream.kafka.binder.auto-create-topics=${KAFKA_AUTOCREATE_TOPICS:false}
spring.cloud.stream.kafka.binder.brokers=${KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
spring.cloud.stream.kafka.binder.required-acks=1
spring.cloud.stream.kafka.binder.transaction.transaction-id-prefix=${KAFKA_TRANSACTION_ID_PREFIX:${spring.application.name}.}
spring.cloud.stream.kafka.binder.transaction.producer.configuration.acks=all
spring.cloud.stream.kafka.binder.transaction.producer.configuration.retries=10

spring.zipkin.enabled=${TRACING_ENABLED:false}
spring.zipkin.discovery-client-enabled=false
spring.zipkin.service.name=${spring.application.name}
spring.zipkin.base-url=${ZIPKIN_BASE_URL:http://localhost:9411}
spring.zipkin.sender.type=web

spring.sleuth.trace-id128=true
spring.sleuth.sampler.rate=${SLEUTH_SAMPLER_RATE:50}
spring.sleuth.sampler.probability=${SLEUTH_SAMPLER_PROBABILITY:0.1}

#spring.security.oauth2.resourceserver.jwt.public-key-location=classpath:keys/jwt-keys.pem.pub

spring.groovy.template.check-template-location=false
                
server.servlet.context-path=${SERVER_SERVLET_CONTEXT_PATH:/}
server.compression.enabled=true

management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=${MANAGEMENT_HEALTH_SHOW_DETAILS:always}
management.endpoint.health.group.liveness.include=info
management.endpoint.health.group.liveness.show-details=ALWAYS
management.endpoint.health.group.readiness.include=diskSpace,ping
management.endpoint.health.group.readiness.show-details=ALWAYS
management.info.git.mode=full
management.server.servlet.context-path=${MANAGEMENT_SERVER_SERVLET_CONTEXT_PATH:/}

bootstrap.yml

spring:
  main.banner-mode: off
  application.name: ${SPRING_APPLICATION_NAME:kafka-streams-retry}
  cloud:
    config:
      enabled: false

logging.pattern.level: "%5p [${spring.zipkin.service.name:${spring.application.name:-}},%X{user:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]"

application.yml

spring:
  kafka.producer.transaction-id-prefix: txDummy.
  cloud:
    stream:
      bindings:
        input:
          group: input
          destination: kafka_retry_store
          consumer:
            back-off-max-interval: 1000
            max-attempts: 1
            
      kafka:
        binder:
          configuration:
            auto.offset.reset: earliest
          headers: x-retries 
          transaction:
            transaction-id-prefix: txKafkaStreamRetry2.
            producer:
              configuration:
                acks: all
                retries: 10        
        bindings:
          input:
            consumer:
              ack-each-record: true
              enable-dlq: false
              auto-commit-offset: true
              auto-commit-on-error: false
              
info.component: Kafka Retry Service

server.port: ${SERVER_PORT:9082}

management.server.port: ${MANAGEMENT_SERVER_PORT:9083}

EventListenerService

package dk.digst.digital.post.kafka.retry;

import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Processor;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.KafkaHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.stereotype.Service;
import dk.digst.digital.post.kafka.retry.KafkaStreamsRetryApplication.GroupNames;
import dk.digst.digital.post.kafka.retry.KafkaStreamsRetryApplication.TopicNames;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class EventListenerService {

  @StreamListener(Processor.INPUT)
  public void eventHandler(GenericMessage<?> message) {
    log.debug("INPUT, received: {}", message);

    throw new RuntimeException("Create fault! in INPUT");
  }

  @KafkaListener(topics = TopicNames.RETRY_1, groupId = GroupNames.RETRY_1,
      containerFactory = "retry1KafkaListenerContainerFactory")
  public void retry1Handler(@Payload byte[] record,
      @Header(KafkaHeaders.DELIVERY_ATTEMPT) int delivery) {
    log.info("Recieved (delivery: {}) in RETRY1", delivery);

    throw new RuntimeException("Create fault! on retry1");
  }

  @KafkaListener(topics = TopicNames.RETRY_2, groupId = GroupNames.RETRY_2,
      containerFactory = "retry2KafkaListenerContainerFactory")
  public void retry2Handler(@Payload byte[] record,
      @Header(KafkaHeaders.DELIVERY_ATTEMPT) int delivery) {
    log.info("Recieved (delivery: {}) in RETRY2", delivery);

    throw new RuntimeException("Create fault! on retry2");
  }

}

build.gradle

buildscript {
  ext {
    springBootVersion = '2.3.2.RELEASE'
    springCloudVersion = 'Hoxton.SR6'
    springDataVersion = 'Neumann-SR1'
  }
}

plugins {
  id 'org.springframework.boot' version "${springBootVersion}"
  id 'java-library'
  id 'groovy'
  id 'maven-publish'
  id 'org.unbroken-dome.test-sets' version '3.0.1'
}

configurations.all {
  resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
  resolutionStrategy.cacheDynamicVersionsFor 0, 'seconds'
}

apply plugin: 'maven-publish'
apply plugin: 'java-library'
apply plugin: 'groovy'
apply plugin: 'org.unbroken-dome.test-sets'
apply plugin: 'jacoco'

configurations {
  compileOnly {
    extendsFrom annotationProcessor
  }

  bom
  compileOnly.extendsFrom(bom)
  annotationProcessor.extendsFrom(bom)
  implementation.extendsFrom(bom)
}

dependencies {
  bom platform (group: 'org.springframework.boot', name: 'spring-boot-dependencies', version: "${springBootVersion}")
  bom platform (group: 'org.springframework.data', name: 'spring-data-releasetrain', version: "${springDataVersion}")
  bom platform (group: 'org.springframework.cloud', name: 'spring-cloud-dependencies', version: "${springCloudVersion}")
  
  annotationProcessor (group: 'org.projectlombok', name: 'lombok')
  compileOnly (group: 'org.projectlombok', name: 'lombok')

  implementation (group: 'org.springframework.boot', name: 'spring-boot-starter-web')
  implementation (group: 'org.springframework.boot', name: 'spring-boot-starter-actuator')
  implementation (group: 'org.springframework.data', name: 'spring-data-rest-webmvc')

  implementation (group: 'org.springframework.cloud', name: 'spring-cloud-starter-sleuth')
  implementation (group: 'org.springframework.cloud', name: 'spring-cloud-starter-zipkin')
  implementation (group: 'org.springframework.cloud', name: 'spring-cloud-stream')
  implementation (group: 'org.springframework.cloud', name: 'spring-cloud-stream-binder-kafka')
  implementation (group: 'org.springframework.kafka', name: 'spring-kafka')
  
  implementation (group: 'org.springframework', name: 'spring-messaging')
}

springBoot {
  buildInfo()
}

It can be seen from kafka that the consumer is behind after this

 docker exec -ti kafka bash -c 'bin/kafka-consumer-groups.sh --describe --bootstrap-server localhost:9093 --group input --offsets'

GROUP           TOPIC             PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                           HOST            CLIENT-ID
input           kafka_retry_store 0          2               4               2               consumer-input-2-85538449-9f60-40f9-8403-f32e2dbc6c28 /192.168.32.1   consumer-input-2
input           kafka_retry_store 1          2               2               0               consumer-input-2-85538449-9f60-40f9-8403-f32e2dbc6c28 /192.168.32.1   consumer-input-2
input           kafka_retry_store 2          4               4               0               consumer-input-2-85538449-9f60-40f9-8403-f32e2dbc6c28 /192.168.32.1   consumer-input-2

If I run this using only spring-kafka with kafka listeners, then everything works as expected. It can also be seen that the propagation using the spring-kafka retry1 and retry2 also works and gets the offset comitted. Only the StreamListener (binding) does not. This seems like an error.

EDIT

The “pure” spring-kafka setup

package dk.digst.digital.post.kafka.retry;

import java.util.HashMap;
import java.util.Map;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.TopicPartition;
import org.apache.kafka.common.serialization.ByteArrayDeserializer;
import org.apache.kafka.common.serialization.ByteArraySerializer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaOperations;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import org.springframework.kafka.listener.ContainerProperties;
import org.springframework.kafka.listener.ContainerProperties.AckMode;
import org.springframework.kafka.listener.DeadLetterPublishingRecoverer;
import org.springframework.kafka.listener.DefaultAfterRollbackProcessor;
import org.springframework.kafka.transaction.KafkaTransactionManager;
import org.springframework.retry.annotation.EnableRetry;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.util.backoff.BackOff;
import org.springframework.util.backoff.FixedBackOff;

@SpringBootApplication(proxyBeanMethods = false)
@EnableTransactionManagement
@EnableKafka
@EnableRetry
public class KafkaRetryApplication {

  public static void main(String[] args) {
    SpringApplication.run(KafkaRetryApplication.class, args);
  }

  @Bean
  public ProducerFactory<byte[], byte[]> producerFactory() {
    Map<String, Object> props = new HashMap<>();
    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);

    DefaultKafkaProducerFactory<byte[], byte[]> factory = new DefaultKafkaProducerFactory<>(props);
    factory.setTransactionIdPrefix("txPrefix.");

    return factory;
  }

  @Bean
  public KafkaTemplate<byte[], byte[]> kafkaTemplate() {
    return new KafkaTemplate<>(producerFactory());
  }

  @Bean
  public ProducerFactory<byte[], byte[]> retryProducerFactory() {
    Map<String, Object> props = new HashMap<>();
    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);

    DefaultKafkaProducerFactory<byte[], byte[]> factory = new DefaultKafkaProducerFactory<>(props);
    factory.setTransactionIdPrefix("txRetryRecoverer.");

    return factory;
  }

  @Bean
  public KafkaTemplate<byte[], byte[]> retryKafkaTemplate() {
    return new KafkaTemplate<>(retryProducerFactory());
  }

  @Bean
  public ConsumerFactory<byte[], byte[]> inputConsumerFactory() {
    return new DefaultKafkaConsumerFactory<>(
        SetupHelper.createConsumerFactoryBaseProps(GroupNames.INPUT));
  }

  @Bean
  public ConcurrentKafkaListenerContainerFactory<byte[], byte[]> inputKafkaListenerContainerFactory(
      KafkaTransactionManager<byte[], byte[]> kafkaTransactionManager,
      ConsumerFactory<byte[], byte[]> inputConsumerFactory,
      KafkaTemplate<byte[], byte[]> retryKafkaTemplate) {

    ConcurrentKafkaListenerContainerFactory<byte[], byte[]> factory =
        new ConcurrentKafkaListenerContainerFactory<>();
    SetupHelper.configureFactory(factory, kafkaTransactionManager, inputConsumerFactory,
        retryKafkaTemplate, TopicNames.RETRY_1, new FixedBackOff(100L, 1L));

    return factory;
  }

  @Bean
  public ConsumerFactory<byte[], byte[]> retry1ConsumerFactory() {
    return new DefaultKafkaConsumerFactory<>(
        SetupHelper.createConsumerFactoryBaseProps(GroupNames.RETRY_1));
  }

  @Bean
  public ConsumerFactory<byte[], byte[]> retry2ConsumerFactory() {
    return new DefaultKafkaConsumerFactory<>(
        SetupHelper.createConsumerFactoryBaseProps(GroupNames.RETRY_2));
  }

  @Bean
  public ConcurrentKafkaListenerContainerFactory<byte[], byte[]> retry1KafkaListenerContainerFactory(
      KafkaTransactionManager<byte[], byte[]> kafkaTransactionManager,
      ConsumerFactory<byte[], byte[]> retry1ConsumerFactory,
      KafkaTemplate<byte[], byte[]> retryKafkaTemplate) {

    ConcurrentKafkaListenerContainerFactory<byte[], byte[]> factory =
        new ConcurrentKafkaListenerContainerFactory<>();
    SetupHelper.configureFactory(factory, kafkaTransactionManager, retry1ConsumerFactory,
        retryKafkaTemplate, TopicNames.RETRY_2, new FixedBackOff(100L, 1L));

    return factory;
  }


  @Bean
  public ConcurrentKafkaListenerContainerFactory<byte[], byte[]> retry2KafkaListenerContainerFactory(
      KafkaTransactionManager<byte[], byte[]> kafkaTransactionManager,
      ConsumerFactory<byte[], byte[]> retry2ConsumerFactory,
      KafkaTemplate<byte[], byte[]> retryKafkaTemplate) {

    ConcurrentKafkaListenerContainerFactory<byte[], byte[]> factory =
        new ConcurrentKafkaListenerContainerFactory<>();
    SetupHelper.configureFactory(factory, kafkaTransactionManager, retry2ConsumerFactory,
        retryKafkaTemplate, TopicNames.DLQ, new FixedBackOff(100L, 1L));

    return factory;
  }

  public static class SetupHelper {

    public static <K, V> void setContainerProps(ContainerProperties containerProperties,
        KafkaTransactionManager<K, V> kafkaTransactionManager) {
      containerProperties.setIdleEventInterval(60000L);
      containerProperties.setTransactionManager(kafkaTransactionManager);
      containerProperties.setAckMode(AckMode.RECORD);
      containerProperties.setDeliveryAttemptHeader(true);
    }

    public static <K, V> void configureFactory(
        ConcurrentKafkaListenerContainerFactory<K, V> factory,
        KafkaTransactionManager<K, V> kafkaTransactionManager,
        ConsumerFactory<K, V> consumerFactory, KafkaOperations<K, V> kafkaTemplate,
        String errorTopicName, BackOff backOff) {
      setContainerProps(factory.getContainerProperties(), kafkaTransactionManager);
      factory.setConsumerFactory(consumerFactory);
      DefaultAfterRollbackProcessor<K, V> afterRollbackProcessor =
          new DefaultAfterRollbackProcessor<>(new DeadLetterPublishingRecoverer(kafkaTemplate,
              (cr, e) -> new TopicPartition(errorTopicName, -1)), backOff);
      factory.setAfterRollbackProcessor(afterRollbackProcessor);
    }

    public static Map<String, Object> createConsumerFactoryBaseProps(String groupId) {
      Map<String, Object> props = new HashMap<>();
      props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
      props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
      props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, ByteArrayDeserializer.class);
      props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ByteArrayDeserializer.class);
      props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
      props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
      return props;
    }

  }

  public static class TopicNames {

    public static final String INPUT = "kafka_retry_store";

    public static final String OUTPUT = "kafka_retry_index";

    public static final String RETRY_1 = "kafka_retry_index_retry_1";

    public static final String RETRY_2 = "kafka_retry_index_retry_2";

    public static final String DLQ = "kafka_retry_index_dlq";
  }

  public static class GroupNames {

    public static final String INPUT = "input";

    public static final String RETRY_1 = "retry1";

    public static final String RETRY_2 = "retry2";

  }

}

bootstrap.yml

spring:
  main.banner-mode: off
  application.name: ${SPRING_APPLICATION_NAME:kafka-retry}
  cloud:
    config:
      enabled: false

logging.pattern.level: "%5p [${spring.zipkin.service.name:${spring.application.name:-}},%X{user:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]"

application.yml

spring:
  kafka:
    producer:
      transaction-id-prefix: ${KAFKA_TRANSACTION_ID_PREFIX:${spring.application.name}.}
      retries: 10
      acks: all
      properties:
        enable:
          idempotence: true

info.component: Kafka Retry Service

server.port: ${SERVER_PORT:9080}

management.server.port: ${MANAGEMENT_SERVER_PORT:9081}

EventListenerService

package dk.digst.digital.post.kafka.retry;

import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.KafkaHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Service;
import dk.digst.digital.post.kafka.retry.KafkaRetryApplication.TopicNames;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class EventListenerService {

  @KafkaListener(topics = TopicNames.INPUT, groupId = "input",
      containerFactory = "inputKafkaListenerContainerFactory")
  public void inputHandler(@Payload byte[] record,
      @Header(KafkaHeaders.DELIVERY_ATTEMPT) int delivery) {
    log.info("Recieved (delivery: {}) in INPUT: {}", delivery, record);

    throw new RuntimeException("Create fault! on input");
  }

  @KafkaListener(topics = TopicNames.RETRY_1, groupId = "retry1",
      containerFactory = "retry1KafkaListenerContainerFactory")
  public void retry1Handler(@Payload byte[] record,
      @Header(KafkaHeaders.DELIVERY_ATTEMPT) int delivery) {
    log.info("Recieved (delivery: {}) in RETRY1: {}", delivery, record);

    throw new RuntimeException("Create fault! on retry1");

  }

  @KafkaListener(topics = TopicNames.RETRY_2, groupId = "retry2",
      containerFactory = "retry2KafkaListenerContainerFactory")
  public void retry2Handler(@Payload byte[] record,
      @Header(KafkaHeaders.DELIVERY_ATTEMPT) int delivery) {
    log.info("Recieved (delivery: {}) in RETRY2: {}", delivery, record);

    throw new RuntimeException("Create fault! on retry2");

  }

}

application.properties & build.gradle are identical to the spring cloud stream ones.

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Reactions: 1
  • Comments: 32 (15 by maintainers)

Most upvoted comments

Yes, it’s not a “real” lag.

Best guess is you are somehow not processing the @KafkaListener in a transaction - the key is to see the offset jump by two for each send and you should always see a lag of 1 with a transactional producer. I added your second-stage retry (with a bit simpler configuration) and it works fine for me.

@SpringBootApplication(proxyBeanMethods = false)
@EnableKafka
@EnableBinding(Sink.class)
public class KafkaStreamsRetryApplication {

	private static final Logger log = LoggerFactory.getLogger(KafkaStreamsRetryApplication.class);

	public static void main(String[] args) {
		SpringApplication.run(KafkaStreamsRetryApplication.class, args);
	}

	@StreamListener(Sink.INPUT)
	public void listen(Message<?> in) {
		log.info("Received: " + in);
		throw new RuntimeException("test");
	}

	@KafkaListener(topics = TopicNames.RETRY_1, groupId = GroupNames.RETRY_1)
	public void retry1Handler(@Payload byte[] record,
			@Header(KafkaHeaders.DELIVERY_ATTEMPT) int delivery) {
		log.info("Recieved (delivery: {}) in RETRY1", delivery);

		throw new RuntimeException("Create fault! on retry1");
	}

	public KafkaOperations<byte[], byte[]> recoverTemplate(BinderFactory binders) {
		ProducerFactory<byte[], byte[]> pf = ((KafkaMessageChannelBinder) binders.getBinder(null, MessageChannel.class))
				.getTransactionalProducerFactory();
		return new KafkaTemplate<>(pf);
	}

	@Bean
	public ListenerContainerCustomizer<AbstractMessageListenerContainer<byte[], byte[]>> listenerContainerCustomizer(
			GenericApplicationContext ctx, BinderFactory binders) {

		return (container, dest, group) -> {
			ctx.registerBean("recoverTemplate", KafkaOperations.class, () -> recoverTemplate(binders));
			KafkaOperations<byte[], byte[]> recoverTemplate = ctx.getBean("recoverTemplate", KafkaOperations.class);

			container.setAfterRollbackProcessor(new DefaultAfterRollbackProcessor<>(
					new DeadLetterPublishingRecoverer(recoverTemplate,
							(cr, e) -> new TopicPartition(TopicNames.RETRY_1, -1)),
					new FixedBackOff(100L, 1L), recoverTemplate, true));
		};
	}

	@Bean
	public DefaultAfterRollbackProcessor<byte[], byte[]> darp(KafkaOperations<byte[], byte[]> kafkaTemplate) {
		return new DefaultAfterRollbackProcessor<byte[], byte[]>(
				new DeadLetterPublishingRecoverer(kafkaTemplate, (cr, e) -> new TopicPartition(TopicNames.RETRY_2, -1)),
				new FixedBackOff(100L, 1), kafkaTemplate, true);
	}

	@Bean
	public ApplicationRunner runner(KafkaTemplate<byte[], byte[]> template) {
		return args -> template.executeInTransaction(t -> t.send(TopicNames.INPUT, "foo".getBytes()));
	}

	public static class TopicNames {

		public static final String INPUT = "kafka_retry_store";

		public static final String OUTPUT = "kafka_retry_index";

		public static final String RETRY_1 = "kafka_retry_index_retry_1";

		public static final String RETRY_2 = "kafka_retry_index_retry_2";

		public static final String DLQ = "kafka_retry_index_dlq";
	}

	public static class GroupNames {

		public static final String INPUT = "input";

		public static final String RETRY_1 = "retry1";

		public static final String RETRY_2 = "retry2";

	}
}

@Component
class Configurer {

	Configurer(AbstractKafkaListenerContainerFactory
				<ConcurrentMessageListenerContainer<byte[], byte[]>, byte[], byte[]> factory,
			DefaultAfterRollbackProcessor<byte[], byte[]> darp) {

		factory.setContainerCustomizer(container -> {
			container.setAfterRollbackProcessor(darp);
			container.getContainerProperties().setDeliveryAttemptHeader(true);
		});
	}

}
spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix=TX-
spring.kafka.producer.retries=10
spring.kafka.producer.acks=all
spring.kafka.producer.transaction-id-prefix=ktx-

spring.cloud.stream.bindings.input.group=input
spring.cloud.stream.bindings.input.destination=kafka_retry_store
$ kafka-consumer-groups --bootstrap-server localhost:9092 --describe --group input

GROUP           TOPIC             PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                           HOST            CLIENT-ID
input           kafka_retry_store 0          -               0               -               consumer-input-2-6e65bc4d-42c3-4808-94ff-92685029c2bc /127.0.0.1      consumer-input-2
input           kafka_retry_store 1          -               0               -               consumer-input-2-6e65bc4d-42c3-4808-94ff-92685029c2bc /127.0.0.1      consumer-input-2
input           kafka_retry_store 2          1               2               1               consumer-input-2-6e65bc4d-42c3-4808-94ff-92685029c2bc /127.0.0.1      consumer-input-2

$ kafka-consumer-groups --bootstrap-server localhost:9092 --describe --group retry1

GROUP           TOPIC                     PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                            HOST            CLIENT-ID
retry1          kafka_retry_index_retry_1 0          1               2               1               consumer-retry1-3-88891d6f-2682-4bf9-8ed8-efbf585af7ad /127.0.0.1      consumer-retry1-3
retry1          kafka_retry_index_retry_1 1          0               0               0               consumer-retry1-3-88891d6f-2682-4bf9-8ed8-efbf585af7ad /127.0.0.1      consumer-retry1-3
retry1          kafka_retry_index_retry_1 2          0               0               0               consumer-retry1-3-88891d6f-2682-4bf9-8ed8-efbf585af7ad /127.0.0.1      consumer-retry1-3

Turns out we can’t do it in spring-kafka, but the binder should certainly not require this complexity to configure it.

This worked for me:

@SpringBootApplication
public class Kbgh946Application {

	public static void main(String[] args) {
		SpringApplication.run(Kbgh946Application.class, args);
	}

	@Bean
	Consumer<String> input() {
		return str -> {
			System.out.println(str);
			throw new RuntimeException("test");
		};
	}

	public KafkaOperations<byte[], byte[]> recoverTemplate(BinderFactory binders) {
		ProducerFactory<byte[], byte[]> pf = ((KafkaMessageChannelBinder) binders.getBinder(null,
				MessageChannel.class)).getTransactionalProducerFactory();
		return new KafkaTemplate<>(pf);
	}

	@Bean
	public ListenerContainerCustomizer<AbstractMessageListenerContainer<?, ?>> customizer(BinderFactory binders,
			GenericApplicationContext ctx) {

		return (container, dest, group) -> {
			ctx.registerBean("recoverTemplate", KafkaOperations.class, () -> recoverTemplate(binders));
			@SuppressWarnings("unchecked")
			KafkaOperations<byte[], byte[]> recoverTemplate = ctx.getBean("recoverTemplate", KafkaOperations.class);
			container.setAfterRollbackProcessor(new DefaultAfterRollbackProcessor<>(
					new DeadLetterPublishingRecoverer(recoverTemplate,
							(cr, e) -> new TopicPartition("errors", -1)),
					new FixedBackOff(3000, 3), recoverTemplate, true));
		};
	}

}
spring.cloud.stream.kafka.binder.transaction.transactionIdPrefix=TX-
spring.kafka.producer.retries=10
spring.kafka.producer.acks=all
$ kafka-console-consumer --bootstrap-server localhost:9092 --topic errors --from-beginning
foo
$ kafka-consumer-groups --bootstrap-server localhost:9092 --describe --group anonymous.d91c6469-7101-4382-a3f6-f03317bcb262

Consumer group 'anonymous.d91c6469-7101-4382-a3f6-f03317bcb262' has no active members.

GROUP                                          TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID     HOST            CLIENT-ID
anonymous.d91c6469-7101-4382-a3f6-f03317bcb262 input-in-0      0          6               6               0               -               -               -
  @Bean
  public KafkaTemplate<byte[], byte[]> recoverTemplate(BinderFactory binders) {
    ProducerFactory<byte[], byte[]> pf =
        ((KafkaMessageChannelBinder) binders.getBinder(null, MessageChannel.class))
            .getTransactionalProducerFactory();
    return new KafkaTemplate<>(pf);
  }

  @Bean
  public ListenerContainerCustomizer<AbstractMessageListenerContainer<byte[], byte[]>> listenerContainerCustomizer(
      KafkaTransactionManager<?, ?> kafkaTransactionManager,
      KafkaOperations<byte[], byte[]> recoverTemplate) {
    return (container, dest, group) -> {
      container.setAfterRollbackProcessor(new DefaultAfterRollbackProcessor<>(
          new DeadLetterPublishingRecoverer(recoverTemplate,
              (cr, e) -> new TopicPartition(TopicNames.RETRY_1, -1)),
          new FixedBackOff(100L, 1L), recoverTemplate, true));
    };
  }

Gives

***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  recoverTemplate defined in dk.digst.digital.post.kafka.retry.KafkaStreamsRetryApplication
↑     ↓
|  kafkaBinderMetrics defined in org.springframework.cloud.stream.binder.kafka.config.KafkaBinderConfiguration$KafkaBinderMetricsConfiguration
↑     ↓
|  kafkaMessageChannelBinder defined in org.springframework.cloud.stream.binder.kafka.config.KafkaBinderConfiguration
↑     ↓
|  listenerContainerCustomizer defined in dk.digst.digital.post.kafka.retry.KafkaStreamsRetryApplication
└─────┘

Doing

 @Bean
  public ListenerContainerCustomizer<AbstractMessageListenerContainer<byte[], byte[]>> listenerContainerCustomizer(
      KafkaTransactionManager<?, ?> kafkaTransactionManager, BinderFactory binders) {
    return (container, dest, group) -> {
      ProducerFactory<byte[], byte[]> pf =
          ((KafkaMessageChannelBinder) binders.getBinder(null, MessageChannel.class))
              .getTransactionalProducerFactory();
      KafkaOperations<byte[], byte[]> recoverTemplate = new KafkaTemplate<>(pf);

      container.setAfterRollbackProcessor(new DefaultAfterRollbackProcessor<>(
          new DeadLetterPublishingRecoverer(recoverTemplate,
              (cr, e) -> new TopicPartition(TopicNames.RETRY_1, -1)),
          new FixedBackOff(100L, 1L), recoverTemplate, true));
    };
  }

Results in:

2020-08-03 16:52:46.887  INFO [kafka-streams-retry,,,,] 43562 --- [container-0-C-1] o.a.k.clients.producer.KafkaProducer     : [Producer clientId=producer-txKafkaStreamRetry2.0, transactionalId=txKafkaStreamRetry2.0] Instantiated a transactional producer.
2020-08-03 16:52:46.890  INFO [kafka-streams-retry,,,,] 43562 --- [container-0-C-1] o.a.kafka.common.utils.AppInfoParser     : Kafka version: 2.5.0
2020-08-03 16:52:46.890  INFO [kafka-streams-retry,,,,] 43562 --- [container-0-C-1] o.a.kafka.common.utils.AppInfoParser     : Kafka commitId: 66563e712b0b9f84
2020-08-03 16:52:46.890  INFO [kafka-streams-retry,,,,] 43562 --- [container-0-C-1] o.a.kafka.common.utils.AppInfoParser     : Kafka startTimeMs: 1596466366890
2020-08-03 16:52:46.892  INFO [kafka-streams-retry,,,,] 43562 --- [container-0-C-1] o.a.k.c.p.internals.TransactionManager   : [Producer clientId=producer-txKafkaStreamRetry2.0, transactionalId=txKafkaStreamRetry2.0] Invoking InitProducerId for the first time in order to acquire a producer ID
2020-08-03 16:52:46.898  INFO [kafka-streams-retry,,,,] 43562 --- [aStreamRetry2.0] org.apache.kafka.clients.Metadata        : [Producer clientId=producer-txKafkaStreamRetry2.0, transactionalId=txKafkaStreamRetry2.0] Cluster ID: aiUcd3EmRMO81l9Rblzy5w
2020-08-03 16:52:46.898  INFO [kafka-streams-retry,,,,] 43562 --- [aStreamRetry2.0] o.a.k.c.p.internals.TransactionManager   : [Producer clientId=producer-txKafkaStreamRetry2.0, transactionalId=txKafkaStreamRetry2.0] Discovered transaction coordinator localhost:9092 (id: 1 rack: null)
2020-08-03 16:52:47.008  INFO [kafka-streams-retry,,,,] 43562 --- [aStreamRetry2.0] o.a.k.c.p.internals.TransactionManager   : [Producer clientId=producer-txKafkaStreamRetry2.0, transactionalId=txKafkaStreamRetry2.0] ProducerId set to 12 with epoch 1
2020-08-03 16:52:47.040 DEBUG [kafka-streams-retry,,,,] 43562 --- [aStreamRetry2.0] o.s.k.l.DeadLetterPublishingRecoverer    : Successful dead-letter publication: SendResult [producerRecord=ProducerRecord(topic=kafka_retry_index_retry_1, partition=null, headers=RecordHeaders(headers = [RecordHeader(key = b3, value = [53, 102, 50, 56, 49, 101, 98, 98, 57, 100, 48, 100, 99, 100, 55, 51, 48, 98, 49, 102, 54, 97, 53, 50, 100, 57, 50, 51, 97, 56, 52, 49, 45, 53, 98, 98, 53, 56, 56, 99, 57, 99, 52, 49, 56, 99, 57, 101, 50, 45, 48]), RecordHeader(key = nativeHeaders, value = [123, 34, 98, 51, 34, 58, 91, 34, 53, 102, 50, 56, 49, 101, 98, 98, 57, 100, 48, 100, 99, 100, 55, 51, 48, 98, 49, 102, 54, 97, 53, 50, 100, 57, 50, 51, 97, 56, 52, 49, 45, 53, 98, 98, 53, 56, 56, 99, 57, 99, 52, 49, 56, 99, 57, 101, 50, 45, 48, 34, 93, 125]), RecordHeader(key = contentType, value = [34, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106, 115, 111, 110, 34]), RecordHeader(key = spring_json_header_types, value = [123, 34, 98, 51, 34, 58, 34, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 83, 116, 114, 105, 110, 103, 34, 44, 34, 110, 97, 116, 105, 118, 101, 72, 101, 97, 100, 101, 114, 115, 34, 58, 34, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 117, 116, 105, 108, 46, 76, 105, 110, 107, 101, 100, 77, 117, 108, 116, 105, 86, 97, 108, 117, 101, 77, 97, 112, 34, 44, 34, 99, 111, 110, 116, 101, 110, 116, 84, 121, 112, 101, 34, 58, 34, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 83, 116, 114, 105, 110, 103, 34, 125]), RecordHeader(key = kafka_deliveryAttempt, value = [0, 0, 0, 2]), RecordHeader(key = kafka_dlt-original-topic, value = [107, 97, 102, 107, 97, 95, 114, 101, 116, 114, 121, 95, 115, 116, 111, 114, 101]), RecordHeader(key = kafka_dlt-original-partition, value = [0, 0, 0, 0]), RecordHeader(key = kafka_dlt-original-offset, value = [0, 0, 0, 0, 0, 0, 0, 4]), RecordHeader(key = kafka_dlt-original-timestamp, value = [0, 0, 1, 115, -76, -72, 10, -36]), RecordHeader(key = kafka_dlt-original-timestamp-type, value = [67, 114, 101, 97, 116, 101, 84, 105, 109, 101]), RecordHeader(key = kafka_dlt-exception-fqcn, value = [111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 76, 105, 115, 116, 101, 110, 101, 114, 69, 120, 101, 99, 117, 116, 105, 111, 110, 70, 97, 105, 108, 101, 100, 69, 120, 99, 101, 112, 116, 105, 111, 110]), RecordHeader(key = kafka_dlt-exception-message, value = [76, 105, 115, 116, 101, 110, 101, 114, 32, 102, 97, 105, 108, 101, 100, 59, 32, 110, 101, 115, 116, 101, 100, 32, 101, 120, 99, 101, 112, 116, 105, 111, 110, 32, 105, 115, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 109, 101, 115, 115, 97, 103, 105, 110, 103, 46, 77, 101, 115, 115, 97, 103, 105, 110, 103, 69, 120, 99, 101, 112, 116, 105, 111, 110, 58, 32, 69, 120, 99, 101, 112, 116, 105, 111, 110, 32, 116, 104, 114, 111, 119, 110, 32, 119, 104, 105, 108, 101, 32, 105, 110, 118, 111, 107, 105, 110, 103, 32, 69, 118, 101, 110, 116, 76, 105, 115, 116, 101, 110, 101, 114, 83, 101, 114, 118, 105, 99, 101, 35, 101, 118, 101, 110, 116, 72, 97, 110, 100, 108, 101, 114, 91, 49, 32, 97, 114, 103, 115, 93, 59, 32, 110, 101, 115, 116, 101, 100, 32, 101, 120, 99, 101, 112, 116, 105, 111, 110, 32, 105, 115, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110, 58, 32, 67, 114, 101, 97, 116, 101, 32, 102, 97, 117, 108, 116, 33, 32, 105, 110, 32, 73, 78, 80, 85, 84, 44, 32, 102, 97, 105, 108, 101, 100, 77, 101, 115, 115, 97, 103, 101, 61, 71, 101, 110, 101, 114, 105, 99, 77, 101, 115, 115, 97, 103, 101, 32, 91, 112, 97, 121, 108, 111, 97, 100, 61, 98, 121, 116, 101, 91, 50, 56, 93, 44, 32, 104, 101, 97, 100, 101, 114, 115, 61, 123, 107, 97, 102, 107, 97, 95, 116, 105, 109, 101, 115, 116, 97, 109, 112, 84, 121, 112, 101, 61, 67, 82, 69, 65, 84, 69, 95, 84, 73, 77, 69, 44, 32, 107, 97, 102, 107, 97, 95, 114, 101, 99, 101, 105, 118, 101, 100, 84, 111, 112, 105, 99, 61, 107, 97, 102, 107, 97, 95, 114, 101, 116, 114, 121, 95, 115, 116, 111, 114, 101, 44, 32, 98, 51, 61, 53, 102, 50, 56, 49, 101, 98, 98, 57, 100, 48, 100, 99, 100, 55, 51, 48, 98, 49, 102, 54, 97, 53, 50, 100, 57, 50, 51, 97, 56, 52, 49, 45, 56, 54, 49, 100, 50, 54, 50, 51, 51, 55, 49, 98, 48, 100, 55, 55, 45, 48, 44, 32, 110, 97, 116, 105, 118, 101, 72, 101, 97, 100, 101, 114, 115, 61, 123, 98, 51, 61, 91, 53, 102, 50, 56, 49, 101, 98, 98, 57, 100, 48, 100, 99, 100, 55, 51, 48, 98, 49, 102, 54, 97, 53, 50, 100, 57, 50, 51, 97, 56, 52, 49, 45, 56, 54, 49, 100, 50, 54, 50, 51, 51, 55, 49, 98, 48, 100, 55, 55, 45, 48, 93, 125, 44, 32, 107, 97, 102, 107, 97, 95, 111, 102, 102, 115, 101, 116, 61, 52, 44, 32, 115, 99, 115, 116, 95, 110, 97, 116, 105, 118, 101, 72, 101, 97, 100, 101, 114, 115, 80, 114, 101, 115, 101, 110, 116, 61, 116, 114, 117, 101, 44, 32, 107, 97, 102, 107, 97, 95, 99, 111, 110, 115, 117, 109, 101, 114, 61, 111, 114, 103, 46, 97, 112, 97, 99, 104, 101, 46, 107, 97, 102, 107, 97, 46, 99, 108, 105, 101, 110, 116, 115, 46, 99, 111, 110, 115, 117, 109, 101, 114, 46, 75, 97, 102, 107, 97, 67, 111, 110, 115, 117, 109, 101, 114, 64, 55, 49, 102, 97, 49, 53, 48, 56, 44, 32, 107, 97, 102, 107, 97, 95, 100, 101, 108, 105, 118, 101, 114, 121, 65, 116, 116, 101, 109, 112, 116, 61, 91, 66, 64, 50, 98, 54, 102, 99, 99, 50, 57, 44, 32, 105, 100, 61, 52, 98, 52, 55, 55, 52, 56, 54, 45, 101, 56, 53, 49, 45, 49, 99, 48, 101, 45, 48, 101, 51, 98, 45, 55, 49, 102, 101, 102, 54, 102, 52, 55, 57, 102, 53, 44, 32, 107, 97, 102, 107, 97, 95, 114, 101, 99, 101, 105, 118, 101, 100, 80, 97, 114, 116, 105, 116, 105, 111, 110, 73, 100, 61, 48, 44, 32, 99, 111, 110, 116, 101, 110, 116, 84, 121, 112, 101, 61, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106, 115, 111, 110, 44, 32, 107, 97, 102, 107, 97, 95, 114, 101, 99, 101, 105, 118, 101, 100, 84, 105, 109, 101, 115, 116, 97, 109, 112, 61, 49, 53, 57, 54, 52, 54, 52, 56, 50, 55, 49, 48, 48, 44, 32, 107, 97, 102, 107, 97, 95, 103, 114, 111, 117, 112, 73, 100, 61, 105, 110, 112, 117, 116, 44, 32, 116, 105, 109, 101, 115, 116, 97, 109, 112, 61, 49, 53, 57, 54, 52, 54, 54, 51, 54, 54, 56, 56, 52, 125, 93]), RecordHeader(key = kafka_dlt-exception-stacktrace, value = [111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 76, 105, 115, 116, 101, 110, 101, 114, 69, 120, 101, 99, 117, 116, 105, 111, 110, 70, 97, 105, 108, 101, 100, 69, 120, 99, 101, 112, 116, 105, 111, 110, 58, 32, 76, 105, 115, 116, 101, 110, 101, 114, 32, 102, 97, 105, 108, 101, 100, 59, 32, 110, 101, 115, 116, 101, 100, 32, 101, 120, 99, 101, 112, 116, 105, 111, 110, 32, 105, 115, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 109, 101, 115, 115, 97, 103, 105, 110, 103, 46, 77, 101, 115, 115, 97, 103, 105, 110, 103, 69, 120, 99, 101, 112, 116, 105, 111, 110, 58, 32, 69, 120, 99, 101, 112, 116, 105, 111, 110, 32, 116, 104, 114, 111, 119, 110, 32, 119, 104, 105, 108, 101, 32, 105, 110, 118, 111, 107, 105, 110, 103, 32, 69, 118, 101, 110, 116, 76, 105, 115, 116, 101, 110, 101, 114, 83, 101, 114, 118, 105, 99, 101, 35, 101, 118, 101, 110, 116, 72, 97, 110, 100, 108, 101, 114, 91, 49, 32, 97, 114, 103, 115, 93, 59, 32, 110, 101, 115, 116, 101, 100, 32, 101, 120, 99, 101, 112, 116, 105, 111, 110, 32, 105, 115, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110, 58, 32, 67, 114, 101, 97, 116, 101, 32, 102, 97, 117, 108, 116, 33, 32, 105, 110, 32, 73, 78, 80, 85, 84, 44, 32, 102, 97, 105, 108, 101, 100, 77, 101, 115, 115, 97, 103, 101, 61, 71, 101, 110, 101, 114, 105, 99, 77, 101, 115, 115, 97, 103, 101, 32, 91, 112, 97, 121, 108, 111, 97, 100, 61, 98, 121, 116, 101, 91, 50, 56, 93, 44, 32, 104, 101, 97, 100, 101, 114, 115, 61, 123, 107, 97, 102, 107, 97, 95, 116, 105, 109, 101, 115, 116, 97, 109, 112, 84, 121, 112, 101, 61, 67, 82, 69, 65, 84, 69, 95, 84, 73, 77, 69, 44, 32, 107, 97, 102, 107, 97, 95, 114, 101, 99, 101, 105, 118, 101, 100, 84, 111, 112, 105, 99, 61, 107, 97, 102, 107, 97, 95, 114, 101, 116, 114, 121, 95, 115, 116, 111, 114, 101, 44, 32, 98, 51, 61, 53, 102, 50, 56, 49, 101, 98, 98, 57, 100, 48, 100, 99, 100, 55, 51, 48, 98, 49, 102, 54, 97, 53, 50, 100, 57, 50, 51, 97, 56, 52, 49, 45, 56, 54, 49, 100, 50, 54, 50, 51, 51, 55, 49, 98, 48, 100, 55, 55, 45, 48, 44, 32, 110, 97, 116, 105, 118, 101, 72, 101, 97, 100, 101, 114, 115, 61, 123, 98, 51, 61, 91, 53, 102, 50, 56, 49, 101, 98, 98, 57, 100, 48, 100, 99, 100, 55, 51, 48, 98, 49, 102, 54, 97, 53, 50, 100, 57, 50, 51, 97, 56, 52, 49, 45, 56, 54, 49, 100, 50, 54, 50, 51, 51, 55, 49, 98, 48, 100, 55, 55, 45, 48, 93, 125, 44, 32, 107, 97, 102, 107, 97, 95, 111, 102, 102, 115, 101, 116, 61, 52, 44, 32, 115, 99, 115, 116, 95, 110, 97, 116, 105, 118, 101, 72, 101, 97, 100, 101, 114, 115, 80, 114, 101, 115, 101, 110, 116, 61, 116, 114, 117, 101, 44, 32, 107, 97, 102, 107, 97, 95, 99, 111, 110, 115, 117, 109, 101, 114, 61, 111, 114, 103, 46, 97, 112, 97, 99, 104, 101, 46, 107, 97, 102, 107, 97, 46, 99, 108, 105, 101, 110, 116, 115, 46, 99, 111, 110, 115, 117, 109, 101, 114, 46, 75, 97, 102, 107, 97, 67, 111, 110, 115, 117, 109, 101, 114, 64, 55, 49, 102, 97, 49, 53, 48, 56, 44, 32, 107, 97, 102, 107, 97, 95, 100, 101, 108, 105, 118, 101, 114, 121, 65, 116, 116, 101, 109, 112, 116, 61, 91, 66, 64, 50, 98, 54, 102, 99, 99, 50, 57, 44, 32, 105, 100, 61, 52, 98, 52, 55, 55, 52, 56, 54, 45, 101, 56, 53, 49, 45, 49, 99, 48, 101, 45, 48, 101, 51, 98, 45, 55, 49, 102, 101, 102, 54, 102, 52, 55, 57, 102, 53, 44, 32, 107, 97, 102, 107, 97, 95, 114, 101, 99, 101, 105, 118, 101, 100, 80, 97, 114, 116, 105, 116, 105, 111, 110, 73, 100, 61, 48, 44, 32, 99, 111, 110, 116, 101, 110, 116, 84, 121, 112, 101, 61, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106, 115, 111, 110, 44, 32, 107, 97, 102, 107, 97, 95, 114, 101, 99, 101, 105, 118, 101, 100, 84, 105, 109, 101, 115, 116, 97, 109, 112, 61, 49, 53, 57, 54, 52, 54, 52, 56, 50, 55, 49, 48, 48, 44, 32, 107, 97, 102, 107, 97, 95, 103, 114, 111, 117, 112, 73, 100, 61, 105, 110, 112, 117, 116, 44, 32, 116, 105, 109, 101, 115, 116, 97, 109, 112, 61, 49, 53, 57, 54, 52, 54, 54, 51, 54, 54, 56, 56, 52, 125, 93, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 36, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 115, 117, 109, 101, 114, 46, 100, 101, 99, 111, 114, 97, 116, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 46, 106, 97, 118, 97, 58, 49, 57, 50, 54, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 36, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 115, 117, 109, 101, 114, 46, 105, 110, 118, 111, 107, 101, 82, 101, 99, 111, 114, 100, 76, 105, 115, 116, 101, 110, 101, 114, 73, 110, 84, 120, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 46, 106, 97, 118, 97, 58, 49, 54, 55, 57, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 36, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 115, 117, 109, 101, 114, 46, 105, 110, 118, 111, 107, 101, 82, 101, 99, 111, 114, 100, 76, 105, 115, 116, 101, 110, 101, 114, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 46, 106, 97, 118, 97, 58, 49, 54, 51, 49, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 36, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 115, 117, 109, 101, 114, 46, 105, 110, 118, 111, 107, 101, 76, 105, 115, 116, 101, 110, 101, 114, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 46, 106, 97, 118, 97, 58, 49, 51, 54, 52, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 36, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 115, 117, 109, 101, 114, 46, 112, 111, 108, 108, 65, 110, 100, 73, 110, 118, 111, 107, 101, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 46, 106, 97, 118, 97, 58, 49, 48, 56, 48, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 36, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 115, 117, 109, 101, 114, 46, 114, 117, 110, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 46, 106, 97, 118, 97, 58, 57, 56, 56, 41, 10, 9, 97, 116, 32, 106, 97, 118, 97, 46, 98, 97, 115, 101, 47, 106, 97, 118, 97, 46, 117, 116, 105, 108, 46, 99, 111, 110, 99, 117, 114, 114, 101, 110, 116, 46, 69, 120, 101, 99, 117, 116, 111, 114, 115, 36, 82, 117, 110, 110, 97, 98, 108, 101, 65, 100, 97, 112, 116, 101, 114, 46, 99, 97, 108, 108, 40, 69, 120, 101, 99, 117, 116, 111, 114, 115, 46, 106, 97, 118, 97, 58, 53, 49, 53, 41, 10, 9, 97, 116, 32, 106, 97, 118, 97, 46, 98, 97, 115, 101, 47, 106, 97, 118, 97, 46, 117, 116, 105, 108, 46, 99, 111, 110, 99, 117, 114, 114, 101, 110, 116, 46, 70, 117, 116, 117, 114, 101, 84, 97, 115, 107, 46, 114, 117, 110, 40, 70, 117, 116, 117, 114, 101, 84, 97, 115, 107, 46, 106, 97, 118, 97, 58, 50, 54, 52, 41, 10, 9, 97, 116, 32, 106, 97, 118, 97, 46, 98, 97, 115, 101, 47, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 84, 104, 114, 101, 97, 100, 46, 114, 117, 110, 40, 84, 104, 114, 101, 97, 100, 46, 106, 97, 118, 97, 58, 56, 51, 52, 41, 10, 67, 97, 117, 115, 101, 100, 32, 98, 121, 58, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 109, 101, 115, 115, 97, 103, 105, 110, 103, 46, 77, 101, 115, 115, 97, 103, 105, 110, 103, 69, 120, 99, 101, 112, 116, 105, 111, 110, 58, 32, 69, 120, 99, 101, 112, 116, 105, 111, 110, 32, 116, 104, 114, 111, 119, 110, 32, 119, 104, 105, 108, 101, 32, 105, 110, 118, 111, 107, 105, 110, 103, 32, 69, 118, 101, 110, 116, 76, 105, 115, 116, 101, 110, 101, 114, 83, 101, 114, 118, 105, 99, 101, 35, 101, 118, 101, 110, 116, 72, 97, 110, 100, 108, 101, 114, 91, 49, 32, 97, 114, 103, 115, 93, 59, 32, 110, 101, 115, 116, 101, 100, 32, 101, 120, 99, 101, 112, 116, 105, 111, 110, 32, 105, 115, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110, 58, 32, 67, 114, 101, 97, 116, 101, 32, 102, 97, 117, 108, 116, 33, 32, 105, 110, 32, 73, 78, 80, 85, 84, 44, 32, 102, 97, 105, 108, 101, 100, 77, 101, 115, 115, 97, 103, 101, 61, 71, 101, 110, 101, 114, 105, 99, 77, 101, 115, 115, 97, 103, 101, 32, 91, 112, 97, 121, 108, 111, 97, 100, 61, 98, 121, 116, 101, 91, 50, 56, 93, 44, 32, 104, 101, 97, 100, 101, 114, 115, 61, 123, 107, 97, 102, 107, 97, 95, 116, 105, 109, 101, 115, 116, 97, 109, 112, 84, 121, 112, 101, 61, 67, 82, 69, 65, 84, 69, 95, 84, 73, 77, 69, 44, 32, 107, 97, 102, 107, 97, 95, 114, 101, 99, 101, 105, 118, 101, 100, 84, 111, 112, 105, 99, 61, 107, 97, 102, 107, 97, 95, 114, 101, 116, 114, 121, 95, 115, 116, 111, 114, 101, 44, 32, 98, 51, 61, 53, 102, 50, 56, 49, 101, 98, 98, 57, 100, 48, 100, 99, 100, 55, 51, 48, 98, 49, 102, 54, 97, 53, 50, 100, 57, 50, 51, 97, 56, 52, 49, 45, 56, 54, 49, 100, 50, 54, 50, 51, 51, 55, 49, 98, 48, 100, 55, 55, 45, 48, 44, 32, 110, 97, 116, 105, 118, 101, 72, 101, 97, 100, 101, 114, 115, 61, 123, 98, 51, 61, 91, 53, 102, 50, 56, 49, 101, 98, 98, 57, 100, 48, 100, 99, 100, 55, 51, 48, 98, 49, 102, 54, 97, 53, 50, 100, 57, 50, 51, 97, 56, 52, 49, 45, 56, 54, 49, 100, 50, 54, 50, 51, 51, 55, 49, 98, 48, 100, 55, 55, 45, 48, 93, 125, 44, 32, 107, 97, 102, 107, 97, 95, 111, 102, 102, 115, 101, 116, 61, 52, 44, 32, 115, 99, 115, 116, 95, 110, 97, 116, 105, 118, 101, 72, 101, 97, 100, 101, 114, 115, 80, 114, 101, 115, 101, 110, 116, 61, 116, 114, 117, 101, 44, 32, 107, 97, 102, 107, 97, 95, 99, 111, 110, 115, 117, 109, 101, 114, 61, 111, 114, 103, 46, 97, 112, 97, 99, 104, 101, 46, 107, 97, 102, 107, 97, 46, 99, 108, 105, 101, 110, 116, 115, 46, 99, 111, 110, 115, 117, 109, 101, 114, 46, 75, 97, 102, 107, 97, 67, 111, 110, 115, 117, 109, 101, 114, 64, 55, 49, 102, 97, 49, 53, 48, 56, 44, 32, 107, 97, 102, 107, 97, 95, 100, 101, 108, 105, 118, 101, 114, 121, 65, 116, 116, 101, 109, 112, 116, 61, 91, 66, 64, 50, 98, 54, 102, 99, 99, 50, 57, 44, 32, 105, 100, 61, 52, 98, 52, 55, 55, 52, 56, 54, 45, 101, 56, 53, 49, 45, 49, 99, 48, 101, 45, 48, 101, 51, 98, 45, 55, 49, 102, 101, 102, 54, 102, 52, 55, 57, 102, 53, 44, 32, 107, 97, 102, 107, 97, 95, 114, 101, 99, 101, 105, 118, 101, 100, 80, 97, 114, 116, 105, 116, 105, 111, 110, 73, 100, 61, 48, 44, 32, 99, 111, 110, 116, 101, 110, 116, 84, 121, 112, 101, 61, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106, 115, 111, 110, 44, 32, 107, 97, 102, 107, 97, 95, 114, 101, 99, 101, 105, 118, 101, 100, 84, 105, 109, 101, 115, 116, 97, 109, 112, 61, 49, 53, 57, 54, 52, 54, 52, 56, 50, 55, 49, 48, 48, 44, 32, 107, 97, 102, 107, 97, 95, 103, 114, 111, 117, 112, 73, 100, 61, 105, 110, 112, 117, 116, 44, 32, 116, 105, 109, 101, 115, 116, 97, 109, 112, 61, 49, 53, 57, 54, 52, 54, 54, 51, 54, 54, 56, 56, 52, 125, 93, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 99, 108, 111, 117, 100, 46, 115, 116, 114, 101, 97, 109, 46, 98, 105, 110, 100, 105, 110, 103, 46, 83, 116, 114, 101, 97, 109, 76, 105, 115, 116, 101, 110, 101, 114, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 46, 104, 97, 110, 100, 108, 101, 82, 101, 113, 117, 101, 115, 116, 77, 101, 115, 115, 97, 103, 101, 40, 83, 116, 114, 101, 97, 109, 76, 105, 115, 116, 101, 110, 101, 114, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 46, 106, 97, 118, 97, 58, 54, 52, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 105, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 104, 97, 110, 100, 108, 101, 114, 46, 65, 98, 115, 116, 114, 97, 99, 116, 82, 101, 112, 108, 121, 80, 114, 111, 100, 117, 99, 105, 110, 103, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 46, 104, 97, 110, 100, 108, 101, 77, 101, 115, 115, 97, 103, 101, 73, 110, 116, 101, 114, 110, 97, 108, 40, 65, 98, 115, 116, 114, 97, 99, 116, 82, 101, 112, 108, 121, 80, 114, 111, 100, 117, 99, 105, 110, 103, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 46, 106, 97, 118, 97, 58, 49, 51, 52, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 105, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 104, 97, 110, 100, 108, 101, 114, 46, 65, 98, 115, 116, 114, 97, 99, 116, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 46, 104, 97, 110, 100, 108, 101, 77, 101, 115, 115, 97, 103, 101, 40, 65, 98, 115, 116, 114, 97, 99, 116, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 46, 106, 97, 118, 97, 58, 54, 50, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 105, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 100, 105, 115, 112, 97, 116, 99, 104, 101, 114, 46, 65, 98, 115, 116, 114, 97, 99, 116, 68, 105, 115, 112, 97, 116, 99, 104, 101, 114, 46, 116, 114, 121, 79, 112, 116, 105, 109, 105, 122, 101, 100, 68, 105, 115, 112, 97, 116, 99, 104, 40, 65, 98, 115, 116, 114, 97, 99, 116, 68, 105, 115, 112, 97, 116, 99, 104, 101, 114, 46, 106, 97, 118, 97, 58, 49, 49, 53, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 105, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 100, 105, 115, 112, 97, 116, 99, 104, 101, 114, 46, 85, 110, 105, 99, 97, 115, 116, 105, 110, 103, 68, 105, 115, 112, 97, 116, 99, 104, 101, 114, 46, 100, 111, 68, 105, 115, 112, 97, 116, 99, 104, 40, 85, 110, 105, 99, 97, 115, 116, 105, 110, 103, 68, 105, 115, 112, 97, 116, 99, 104, 101, 114, 46, 106, 97, 118, 97, 58, 49, 51, 51, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 105, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 100, 105, 115, 112, 97, 116, 99, 104, 101, 114, 46, 85, 110, 105, 99, 97, 115, 116, 105, 110, 103, 68, 105, 115, 112, 97, 116, 99, 104, 101, 114, 46, 100, 105, 115, 112, 97, 116, 99, 104, 40, 85, 110, 105, 99, 97, 115, 116, 105, 110, 103, 68, 105, 115, 112, 97, 116, 99, 104, 101, 114, 46, 106, 97, 118, 97, 58, 49, 48, 54, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 105, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 99, 104, 97, 110, 110, 101, 108, 46, 65, 98, 115, 116, 114, 97, 99, 116, 83, 117, 98, 115, 99, 114, 105, 98, 97, 98, 108, 101, 67, 104, 97, 110, 110, 101, 108, 46, 100, 111, 83, 101, 110, 100, 40, 65, 98, 115, 116, 114, 97, 99, 116, 83, 117, 98, 115, 99, 114, 105, 98, 97, 98, 108, 101, 67, 104, 97, 110, 110, 101, 108, 46, 106, 97, 118, 97, 58, 55, 50, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 105, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 99, 104, 97, 110, 110, 101, 108, 46, 65, 98, 115, 116, 114, 97, 99, 116, 77, 101, 115, 115, 97, 103, 101, 67, 104, 97, 110, 110, 101, 108, 46, 115, 101, 110, 100, 40, 65, 98, 115, 116, 114, 97, 99, 116, 77, 101, 115, 115, 97, 103, 101, 67, 104, 97, 110, 110, 101, 108, 46, 106, 97, 118, 97, 58, 53, 55, 48, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 105, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 99, 104, 97, 110, 110, 101, 108, 46, 65, 98, 115, 116, 114, 97, 99, 116, 77, 101, 115, 115, 97, 103, 101, 67, 104, 97, 110, 110, 101, 108, 46, 115, 101, 110, 100, 40, 65, 98, 115, 116, 114, 97, 99, 116, 77, 101, 115, 115, 97, 103, 101, 67, 104, 97, 110, 110, 101, 108, 46, 106, 97, 118, 97, 58, 53, 50, 48, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 109, 101, 115, 115, 97, 103, 105, 110, 103, 46, 99, 111, 114, 101, 46, 71, 101, 110, 101, 114, 105, 99, 77, 101, 115, 115, 97, 103, 105, 110, 103, 84, 101, 109, 112, 108, 97, 116, 101, 46, 100, 111, 83, 101, 110, 100, 40, 71, 101, 110, 101, 114, 105, 99, 77, 101, 115, 115, 97, 103, 105, 110, 103, 84, 101, 109, 112, 108, 97, 116, 101, 46, 106, 97, 118, 97, 58, 49, 56, 55, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 109, 101, 115, 115, 97, 103, 105, 110, 103, 46, 99, 111, 114, 101, 46, 71, 101, 110, 101, 114, 105, 99, 77, 101, 115, 115, 97, 103, 105, 110, 103, 84, 101, 109, 112, 108, 97, 116, 101, 46, 100, 111, 83, 101, 110, 100, 40, 71, 101, 110, 101, 114, 105, 99, 77, 101, 115, 115, 97, 103, 105, 110, 103, 84, 101, 109, 112, 108, 97, 116, 101, 46, 106, 97, 118, 97, 58, 49, 54, 54, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 109, 101, 115, 115, 97, 103, 105, 110, 103, 46, 99, 111, 114, 101, 46, 71, 101, 110, 101, 114, 105, 99, 77, 101, 115, 115, 97, 103, 105, 110, 103, 84, 101, 109, 112, 108, 97, 116, 101, 46, 100, 111, 83, 101, 110, 100, 40, 71, 101, 110, 101, 114, 105, 99, 77, 101, 115, 115, 97, 103, 105, 110, 103, 84, 101, 109, 112, 108, 97, 116, 101, 46, 106, 97, 118, 97, 58, 52, 55, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 109, 101, 115, 115, 97, 103, 105, 110, 103, 46, 99, 111, 114, 101, 46, 65, 98, 115, 116, 114, 97, 99, 116, 77, 101, 115, 115, 97, 103, 101, 83, 101, 110, 100, 105, 110, 103, 84, 101, 109, 112, 108, 97, 116, 101, 46, 115, 101, 110, 100, 40, 65, 98, 115, 116, 114, 97, 99, 116, 77, 101, 115, 115, 97, 103, 101, 83, 101, 110, 100, 105, 110, 103, 84, 101, 109, 112, 108, 97, 116, 101, 46, 106, 97, 118, 97, 58, 49, 48, 57, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 105, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 101, 110, 100, 112, 111, 105, 110, 116, 46, 77, 101, 115, 115, 97, 103, 101, 80, 114, 111, 100, 117, 99, 101, 114, 83, 117, 112, 112, 111, 114, 116, 46, 115, 101, 110, 100, 77, 101, 115, 115, 97, 103, 101, 40, 77, 101, 115, 115, 97, 103, 101, 80, 114, 111, 100, 117, 99, 101, 114, 83, 117, 112, 112, 111, 114, 116, 46, 106, 97, 118, 97, 58, 50, 48, 56, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 105, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 107, 97, 102, 107, 97, 46, 105, 110, 98, 111, 117, 110, 100, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 68, 114, 105, 118, 101, 110, 67, 104, 97, 110, 110, 101, 108, 65, 100, 97, 112, 116, 101, 114, 46, 115, 101, 110, 100, 77, 101, 115, 115, 97, 103, 101, 73, 102, 65, 110, 121, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 68, 114, 105, 118, 101, 110, 67, 104, 97, 110, 110, 101, 108, 65, 100, 97, 112, 116, 101, 114, 46, 106, 97, 118, 97, 58, 51, 56, 52, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 105, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 107, 97, 102, 107, 97, 46, 105, 110, 98, 111, 117, 110, 100, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 68, 114, 105, 118, 101, 110, 67, 104, 97, 110, 110, 101, 108, 65, 100, 97, 112, 116, 101, 114, 46, 97, 99, 99, 101, 115, 115, 36, 51, 48, 48, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 68, 114, 105, 118, 101, 110, 67, 104, 97, 110, 110, 101, 108, 65, 100, 97, 112, 116, 101, 114, 46, 106, 97, 118, 97, 58, 55, 53, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 105, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 107, 97, 102, 107, 97, 46, 105, 110, 98, 111, 117, 110, 100, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 68, 114, 105, 118, 101, 110, 67, 104, 97, 110, 110, 101, 108, 65, 100, 97, 112, 116, 101, 114, 36, 73, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 82, 101, 99, 111, 114, 100, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 46, 111, 110, 77, 101, 115, 115, 97, 103, 101, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 68, 114, 105, 118, 101, 110, 67, 104, 97, 110, 110, 101, 108, 65, 100, 97, 112, 116, 101, 114, 46, 106, 97, 118, 97, 58, 52, 52, 51, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 105, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 107, 97, 102, 107, 97, 46, 105, 110, 98, 111, 117, 110, 100, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 68, 114, 105, 118, 101, 110, 67, 104, 97, 110, 110, 101, 108, 65, 100, 97, 112, 116, 101, 114, 36, 73, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 82, 101, 99, 111, 114, 100, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 46, 111, 110, 77, 101, 115, 115, 97, 103, 101, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 68, 114, 105, 118, 101, 110, 67, 104, 97, 110, 110, 101, 108, 65, 100, 97, 112, 116, 101, 114, 46, 106, 97, 118, 97, 58, 52, 49, 55, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 36, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 115, 117, 109, 101, 114, 46, 100, 111, 73, 110, 118, 111, 107, 101, 79, 110, 77, 101, 115, 115, 97, 103, 101, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 46, 106, 97, 118, 97, 58, 49, 56, 55, 56, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 36, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 115, 117, 109, 101, 114, 46, 105, 110, 118, 111, 107, 101, 79, 110, 77, 101, 115, 115, 97, 103, 101, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 46, 106, 97, 118, 97, 58, 49, 56, 54, 48, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 36, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 115, 117, 109, 101, 114, 46, 100, 111, 73, 110, 118, 111, 107, 101, 82, 101, 99, 111, 114, 100, 76, 105, 115, 116, 101, 110, 101, 114, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 46, 106, 97, 118, 97, 58, 49, 55, 57, 55, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 36, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 115, 117, 109, 101, 114, 46, 97, 99, 99, 101, 115, 115, 36, 49, 57, 48, 48, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 46, 106, 97, 118, 97, 58, 52, 51, 48, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 36, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 115, 117, 109, 101, 114, 36, 51, 46, 100, 111, 73, 110, 84, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 87, 105, 116, 104, 111, 117, 116, 82, 101, 115, 117, 108, 116, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 46, 106, 97, 118, 97, 58, 49, 54, 54, 53, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 46, 115, 117, 112, 112, 111, 114, 116, 46, 84, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 67, 97, 108, 108, 98, 97, 99, 107, 87, 105, 116, 104, 111, 117, 116, 82, 101, 115, 117, 108, 116, 46, 100, 111, 73, 110, 84, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 40, 84, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 67, 97, 108, 108, 98, 97, 99, 107, 87, 105, 116, 104, 111, 117, 116, 82, 101, 115, 117, 108, 116, 46, 106, 97, 118, 97, 58, 51, 54, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 116, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 46, 115, 117, 112, 112, 111, 114, 116, 46, 84, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 84, 101, 109, 112, 108, 97, 116, 101, 46, 101, 120, 101, 99, 117, 116, 101, 40, 84, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 84, 101, 109, 112, 108, 97, 116, 101, 46, 106, 97, 118, 97, 58, 49, 52, 48, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 107, 97, 102, 107, 97, 46, 108, 105, 115, 116, 101, 110, 101, 114, 46, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 36, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 115, 117, 109, 101, 114, 46, 105, 110, 118, 111, 107, 101, 82, 101, 99, 111, 114, 100, 76, 105, 115, 116, 101, 110, 101, 114, 73, 110, 84, 120, 40, 75, 97, 102, 107, 97, 77, 101, 115, 115, 97, 103, 101, 76, 105, 115, 116, 101, 110, 101, 114, 67, 111, 110, 116, 97, 105, 110, 101, 114, 46, 106, 97, 118, 97, 58, 49, 54, 53, 54, 41, 10, 9, 46, 46, 46, 32, 55, 32, 109, 111, 114, 101, 10, 67, 97, 117, 115, 101, 100, 32, 98, 121, 58, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110, 58, 32, 67, 114, 101, 97, 116, 101, 32, 102, 97, 117, 108, 116, 33, 32, 105, 110, 32, 73, 78, 80, 85, 84, 10, 9, 97, 116, 32, 100, 107, 46, 100, 105, 103, 115, 116, 46, 100, 105, 103, 105, 116, 97, 108, 46, 112, 111, 115, 116, 46, 107, 97, 102, 107, 97, 46, 114, 101, 116, 114, 121, 46, 69, 118, 101, 110, 116, 76, 105, 115, 116, 101, 110, 101, 114, 83, 101, 114, 118, 105, 99, 101, 46, 101, 118, 101, 110, 116, 72, 97, 110, 100, 108, 101, 114, 40, 69, 118, 101, 110, 116, 76, 105, 115, 116, 101, 110, 101, 114, 83, 101, 114, 118, 105, 99, 101, 46, 106, 97, 118, 97, 58, 50, 51, 41, 10, 9, 97, 116, 32, 106, 97, 118, 97, 46, 98, 97, 115, 101, 47, 106, 100, 107, 46, 105, 110, 116, 101, 114, 110, 97, 108, 46, 114, 101, 102, 108, 101, 99, 116, 46, 78, 97, 116, 105, 118, 101, 77, 101, 116, 104, 111, 100, 65, 99, 99, 101, 115, 115, 111, 114, 73, 109, 112, 108, 46, 105, 110, 118, 111, 107, 101, 48, 40, 78, 97, 116, 105, 118, 101, 32, 77, 101, 116, 104, 111, 100, 41, 10, 9, 97, 116, 32, 106, 97, 118, 97, 46, 98, 97, 115, 101, 47, 106, 100, 107, 46, 105, 110, 116, 101, 114, 110, 97, 108, 46, 114, 101, 102, 108, 101, 99, 116, 46, 78, 97, 116, 105, 118, 101, 77, 101, 116, 104, 111, 100, 65, 99, 99, 101, 115, 115, 111, 114, 73, 109, 112, 108, 46, 105, 110, 118, 111, 107, 101, 40, 78, 97, 116, 105, 118, 101, 77, 101, 116, 104, 111, 100, 65, 99, 99, 101, 115, 115, 111, 114, 73, 109, 112, 108, 46, 106, 97, 118, 97, 58, 54, 50, 41, 10, 9, 97, 116, 32, 106, 97, 118, 97, 46, 98, 97, 115, 101, 47, 106, 100, 107, 46, 105, 110, 116, 101, 114, 110, 97, 108, 46, 114, 101, 102, 108, 101, 99, 116, 46, 68, 101, 108, 101, 103, 97, 116, 105, 110, 103, 77, 101, 116, 104, 111, 100, 65, 99, 99, 101, 115, 115, 111, 114, 73, 109, 112, 108, 46, 105, 110, 118, 111, 107, 101, 40, 68, 101, 108, 101, 103, 97, 116, 105, 110, 103, 77, 101, 116, 104, 111, 100, 65, 99, 99, 101, 115, 115, 111, 114, 73, 109, 112, 108, 46, 106, 97, 118, 97, 58, 52, 51, 41, 10, 9, 97, 116, 32, 106, 97, 118, 97, 46, 98, 97, 115, 101, 47, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 114, 101, 102, 108, 101, 99, 116, 46, 77, 101, 116, 104, 111, 100, 46, 105, 110, 118, 111, 107, 101, 40, 77, 101, 116, 104, 111, 100, 46, 106, 97, 118, 97, 58, 53, 54, 54, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 109, 101, 115, 115, 97, 103, 105, 110, 103, 46, 104, 97, 110, 100, 108, 101, 114, 46, 105, 110, 118, 111, 99, 97, 116, 105, 111, 110, 46, 73, 110, 118, 111, 99, 97, 98, 108, 101, 72, 97, 110, 100, 108, 101, 114, 77, 101, 116, 104, 111, 100, 46, 100, 111, 73, 110, 118, 111, 107, 101, 40, 73, 110, 118, 111, 99, 97, 98, 108, 101, 72, 97, 110, 100, 108, 101, 114, 77, 101, 116, 104, 111, 100, 46, 106, 97, 118, 97, 58, 49, 55, 49, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 109, 101, 115, 115, 97, 103, 105, 110, 103, 46, 104, 97, 110, 100, 108, 101, 114, 46, 105, 110, 118, 111, 99, 97, 116, 105, 111, 110, 46, 73, 110, 118, 111, 99, 97, 98, 108, 101, 72, 97, 110, 100, 108, 101, 114, 77, 101, 116, 104, 111, 100, 46, 105, 110, 118, 111, 107, 101, 40, 73, 110, 118, 111, 99, 97, 98, 108, 101, 72, 97, 110, 100, 108, 101, 114, 77, 101, 116, 104, 111, 100, 46, 106, 97, 118, 97, 58, 49, 50, 48, 41, 10, 9, 97, 116, 32, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 99, 108, 111, 117, 100, 46, 115, 116, 114, 101, 97, 109, 46, 98, 105, 110, 100, 105, 110, 103, 46, 83, 116, 114, 101, 97, 109, 76, 105, 115, 116, 101, 110, 101, 114, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 46, 104, 97, 110, 100, 108, 101, 82, 101, 113, 117, 101, 115, 116, 77, 101, 115, 115, 97, 103, 101, 40, 83, 116, 114, 101, 97, 109, 76, 105, 115, 116, 101, 110, 101, 114, 77, 101, 115, 115, 97, 103, 101, 72, 97, 110, 100, 108, 101, 114, 46, 106, 97, 118, 97, 58, 53, 53, 41, 10, 9, 46, 46, 46, 32, 51, 50, 32, 109, 111, 114, 101, 10])], isReadOnly = true), key=null, value=[B@4c71797a, timestamp=null), recordMetadata=kafka_retry_index_retry_1-1@8]
2020-08-03 16:52:47.042  INFO [kafka-streams-retry,,,,] 43562 --- [ntainer#0-0-C-1] o.a.k.clients.producer.KafkaProducer     : [Producer clientId=producer-txPrefix.retry1.kafka_retry_index_retry_1.1, transactionalId=txPrefix.retry1.kafka_retry_index_retry_1.1] Instantiated a transactional producer.
2020-08-03 16:52:47.045  INFO [kafka-streams-retry,,,,] 43562 --- [ntainer#0-0-C-1] o.a.k.clients.producer.KafkaProducer     : [Producer clientId=producer-txPrefix.retry1.kafka_retry_index_retry_1.1, transactionalId=txPrefix.retry1.kafka_retry_index_retry_1.1] Overriding the default retries config to the recommended value of 2147483647 since the idempotent producer is enabled.
2020-08-03 16:52:47.045  INFO [kafka-streams-retry,,,,] 43562 --- [ntainer#0-0-C-1] o.a.k.clients.producer.KafkaProducer     : [Producer clientId=producer-txPrefix.retry1.kafka_retry_index_retry_1.1, transactionalId=txPrefix.retry1.kafka_retry_index_retry_1.1] Overriding the default acks to all since idempotence is enabled.
2020-08-03 16:52:47.047  INFO [kafka-streams-retry,,,,] 43562 --- [ntainer#0-0-C-1] o.a.kafka.common.utils.AppInfoParser     : Kafka version: 2.5.0
2020-08-03 16:52:47.047  INFO [kafka-streams-retry,,,,] 43562 --- [ntainer#0-0-C-1] o.a.kafka.common.utils.AppInfoParser     : Kafka commitId: 66563e712b0b9f84
2020-08-03 16:52:47.047 DEBUG [kafka-streams-retry,,,,] 43562 --- [container-0-C-1] o.s.k.l.DefaultAfterRollbackProcessor    : Skipping seek of: ConsumerRecord(topic = kafka_retry_store, partition = 0, leaderEpoch = 0, offset = 4, CreateTime = 1596464827100, serialized key size = -1, serialized value size = 28, headers = RecordHeaders(headers = [RecordHeader(key = b3, value = [53, 102, 50, 56, 49, 101, 98, 98, 57, 100, 48, 100, 99, 100, 55, 51, 48, 98, 49, 102, 54, 97, 53, 50, 100, 57, 50, 51, 97, 56, 52, 49, 45, 53, 98, 98, 53, 56, 56, 99, 57, 99, 52, 49, 56, 99, 57, 101, 50, 45, 48]), RecordHeader(key = nativeHeaders, value = [123, 34, 98, 51, 34, 58, 91, 34, 53, 102, 50, 56, 49, 101, 98, 98, 57, 100, 48, 100, 99, 100, 55, 51, 48, 98, 49, 102, 54, 97, 53, 50, 100, 57, 50, 51, 97, 56, 52, 49, 45, 53, 98, 98, 53, 56, 56, 99, 57, 99, 52, 49, 56, 99, 57, 101, 50, 45, 48, 34, 93, 125]), RecordHeader(key = contentType, value = [34, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106, 115, 111, 110, 34]), RecordHeader(key = spring_json_header_types, value = [123, 34, 98, 51, 34, 58, 34, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 83, 116, 114, 105, 110, 103, 34, 44, 34, 110, 97, 116, 105, 118, 101, 72, 101, 97, 100, 101, 114, 115, 34, 58, 34, 111, 114, 103, 46, 115, 112, 114, 105, 110, 103, 102, 114, 97, 109, 101, 119, 111, 114, 107, 46, 117, 116, 105, 108, 46, 76, 105, 110, 107, 101, 100, 77, 117, 108, 116, 105, 86, 97, 108, 117, 101, 77, 97, 112, 34, 44, 34, 99, 111, 110, 116, 101, 110, 116, 84, 121, 112, 101, 34, 58, 34, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 83, 116, 114, 105, 110, 103, 34, 125]), RecordHeader(key = kafka_deliveryAttempt, value = [0, 0, 0, 2])], isReadOnly = false), key = null, value = [B@4c71797a)
2020-08-03 16:52:47.048  INFO [kafka-streams-retry,,,,] 43562 --- [ntainer#0-0-C-1] o.a.kafka.common.utils.AppInfoParser     : Kafka startTimeMs: 1596466367047
2020-08-03 16:52:47.049  INFO [kafka-streams-retry,,,,] 43562 --- [ntainer#0-0-C-1] o.a.k.c.p.internals.TransactionManager   : [Producer clientId=producer-txPrefix.retry1.kafka_retry_index_retry_1.1, transactionalId=txPrefix.retry1.kafka_retry_index_retry_1.1] Invoking InitProducerId for the first time in order to acquire a producer ID
2020-08-03 16:52:47.050 ERROR [kafka-streams-retry,,,,] 43562 --- [container-0-C-1] essageListenerContainer$ListenerConsumer : Consumer exception

java.lang.IllegalArgumentException: No transaction in process
	at org.springframework.util.Assert.isTrue(Assert.java:121)
	at org.springframework.kafka.core.KafkaTemplate.producerForOffsets(KafkaTemplate.java:532)
	at org.springframework.kafka.core.KafkaTemplate.sendOffsetsToTransaction(KafkaTemplate.java:516)
	at org.springframework.kafka.core.KafkaTemplate.sendOffsetsToTransaction(KafkaTemplate.java:511)
	at org.springframework.kafka.listener.DefaultAfterRollbackProcessor.process(DefaultAfterRollbackProcessor.java:149)
	at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer$4.doInTransactionWithoutResult(KafkaMessageListenerContainer.java:1710)
	at org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:36)
	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
	at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.recordAfterRollback(KafkaMessageListenerContainer.java:1706)
	at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListenerInTx(KafkaMessageListenerContainer.java:1679)
	at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListener(KafkaMessageListenerContainer.java:1631)
	at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:1364)
	at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1080)
	at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:988)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.lang.Thread.run(Thread.java:834)

2020-08-03 16:52:47.055  INFO [kafka-streams-retry,,,,] 43562 --- [index_retry_1.1] org.apache.kafka.clients.Metadata        : [Producer clientId=producer-txPrefix.retry1.kafka_retry_index_retry_1.1, transactionalId=txPrefix.retry1.kafka_retry_index_retry_1.1] Cluster ID: aiUcd3EmRMO81l9Rblzy5w
2020-08-03 16:52:47.057  INFO [kafka-streams-retry,,,,] 43562 --- [index_retry_1.1] o.a.k.c.p.internals.TransactionManager   : [Producer clientId=producer-txPrefix.retry1.kafka_retry_index_retry_1.1, transactionalId=txPrefix.retry1.kafka_retry_index_retry_1.1] Discovered transaction coordinator localhost:9092 (id: 1 rack: null)
2020-08-03 16:52:47.166  INFO [kafka-streams-retry,,,,] 43562 --- [index_retry_1.1] o.a.k.c.p.internals.TransactionManager   : [Producer clientId=producer-txPrefix.retry1.kafka_retry_index_retry_1.1, transactionalId=txPrefix.retry1.kafka_retry_index_retry_1.1] ProducerId set to 7 with epoch 4