All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.linyuzai.event.kafka.subscriber.DefaultKafkaEventSubscriber Maven / Gradle / Ivy

There is a newer version: 1.1.1
Show newest version
package com.github.linyuzai.event.kafka.subscriber;

import com.github.linyuzai.event.core.codec.EventDecoder;
import com.github.linyuzai.event.core.context.EventContext;
import com.github.linyuzai.event.core.error.EventErrorHandler;
import com.github.linyuzai.event.kafka.endpoint.KafkaEventEndpoint;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.listener.AcknowledgingMessageListener;
import org.springframework.kafka.listener.ContainerProperties;
import org.springframework.kafka.listener.MessageListener;

import java.lang.reflect.Type;

public abstract class DefaultKafkaEventSubscriber extends AbstractKafkaEventSubscriber {

    @Override
    public MessageListener createMessageListener(Type type, KafkaEventEndpoint endpoint, EventContext context) {
        ContainerProperties.AckMode mode = endpoint.getProperties().getListener().getAckMode();
        if (mode == ContainerProperties.AckMode.MANUAL || mode == ContainerProperties.AckMode.MANUAL_IMMEDIATE) {
            return (AcknowledgingMessageListener) (data, acknowledgment) ->
                    handleMessage(data, type, endpoint, context, acknowledgment::acknowledge);
        } else {
            return (MessageListener) data -> handleMessage(data, type, endpoint, context, null);
        }
    }

    @SuppressWarnings("unchecked")
    private void handleMessage(ConsumerRecord data,
                               Type type,
                               KafkaEventEndpoint endpoint,
                               EventContext context,
                               Runnable runnable) {
        EventErrorHandler errorHandler = context.get(EventErrorHandler.class);
        try {
            Object value = data.value();
            EventDecoder decoder = context.get(EventDecoder.class);
            onEvent((T) (decoder == null ? value : decoder.decode(value, type)), endpoint, context);
            if (runnable != null) {
                runnable.run();
            }
        } catch (Throwable e) {
            errorHandler.onError(e, endpoint, context);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy