Apache kafka 为主题动态创建消息Lisener

Apache kafka 为主题动态创建消息Lisener,apache-kafka,spring-kafka,Apache Kafka,Spring Kafka,我在分析一个关于创建一个通用消费者库的问题,这个库可以部署在多个微服务中,所有这些都是基于spring的。我们需要听大约15-20个主题。如果我们使用基于注释的kafka监听器,我们需要为每个微服务添加更多的代码。是否有任何方法可以基于某个xml文件动态创建消费者,每个消费者都可以在其中注入这些数据 话题 用户组 隔断 过滤器(如有) 对于注释,设计非常严格。我能想到的唯一方法是,我们可以在解析xml配置后创建MessageListener,每个主题都有自己的concurrentmessagel

我在分析一个关于创建一个通用消费者库的问题,这个库可以部署在多个微服务中,所有这些都是基于spring的。我们需要听大约15-20个主题。如果我们使用基于注释的kafka监听器,我们需要为每个微服务添加更多的代码。是否有任何方法可以基于某个xml文件动态创建消费者,每个消费者都可以在其中注入这些数据

话题 用户组 隔断 过滤器(如有) 对于注释,设计非常严格。我能想到的唯一方法是,我们可以在解析xml配置后创建MessageListener,每个主题都有自己的concurrentmessagelistenercontainer

使用spring是否有其他更好的方法

附言:我对春天和卡夫卡有点陌生。请让我知道在解释要求时是否有混淆

谢谢,
Rajasekhar

也许你可以使用主题模式。看一看。例如,听众

@KafkaListener(topicPattern = "topic1|topic2")
将收听主题1和主题2

如果需要动态创建侦听器,则必须格外小心,因为必须关闭它

我将使用与spring类似的方法。此后处理器负责处理@KafkaListeners

下面是一个关于它如何工作的建议:

public class DynamicEndpointRegistrar {

    private BeanFactory beanFactory;
    private KafkaListenerContainerFactory<?> containerFactory;
    private KafkaListenerEndpointRegistry endpointRegistry;
    private MessageHandlerMethodFactory messageHandlerMethodFactory;

    public DynamicEndpointRegistrar(BeanFactory beanFactory,
            KafkaListenerContainerFactory<?> containerFactory,
            KafkaListenerEndpointRegistry endpointRegistry, MessageHandlerMethodFactory messageHandlerMethodFactory) {
        this.beanFactory = beanFactory;
        this.containerFactory = containerFactory;
        this.endpointRegistry = endpointRegistry;
        this.messageHandlerMethodFactory = messageHandlerMethodFactory;
    }

    public void registerMethodEndpoint(String endpointId, Object bean, Method method, Properties consumerProperties,
            String... topics) throws Exception {
        KafkaListenerEndpointRegistrar registrar = new KafkaListenerEndpointRegistrar();
        registrar.setBeanFactory(beanFactory);
        registrar.setContainerFactory(containerFactory);
        registrar.setEndpointRegistry(endpointRegistry);
        registrar.setMessageHandlerMethodFactory(messageHandlerMethodFactory);

        MethodKafkaListenerEndpoint<Integer, String> endpoint = new MethodKafkaListenerEndpoint<>();
        endpoint.setBeanFactory(beanFactory);
        endpoint.setMessageHandlerMethodFactory(messageHandlerMethodFactory);

        endpoint.setId(endpointId);
        endpoint.setGroupId(consumerProperties.getProperty(ConsumerConfig.GROUP_ID_CONFIG));
        endpoint.setBean(bean);
        endpoint.setMethod(method);

        endpoint.setConsumerProperties(consumerProperties);
        endpoint.setTopics(topics);

        registrar.registerEndpoint(endpoint);
        registrar.afterPropertiesSet();
    }

}

也许你可以使用主题模式。看一看。例如,听众

@KafkaListener(topicPattern = "topic1|topic2")
将收听主题1和主题2

如果需要动态创建侦听器,则必须格外小心,因为必须关闭它

我将使用与spring类似的方法。此后处理器负责处理@KafkaListeners

下面是一个关于它如何工作的建议:

public class DynamicEndpointRegistrar {

    private BeanFactory beanFactory;
    private KafkaListenerContainerFactory<?> containerFactory;
    private KafkaListenerEndpointRegistry endpointRegistry;
    private MessageHandlerMethodFactory messageHandlerMethodFactory;

    public DynamicEndpointRegistrar(BeanFactory beanFactory,
            KafkaListenerContainerFactory<?> containerFactory,
            KafkaListenerEndpointRegistry endpointRegistry, MessageHandlerMethodFactory messageHandlerMethodFactory) {
        this.beanFactory = beanFactory;
        this.containerFactory = containerFactory;
        this.endpointRegistry = endpointRegistry;
        this.messageHandlerMethodFactory = messageHandlerMethodFactory;
    }

    public void registerMethodEndpoint(String endpointId, Object bean, Method method, Properties consumerProperties,
            String... topics) throws Exception {
        KafkaListenerEndpointRegistrar registrar = new KafkaListenerEndpointRegistrar();
        registrar.setBeanFactory(beanFactory);
        registrar.setContainerFactory(containerFactory);
        registrar.setEndpointRegistry(endpointRegistry);
        registrar.setMessageHandlerMethodFactory(messageHandlerMethodFactory);

        MethodKafkaListenerEndpoint<Integer, String> endpoint = new MethodKafkaListenerEndpoint<>();
        endpoint.setBeanFactory(beanFactory);
        endpoint.setMessageHandlerMethodFactory(messageHandlerMethodFactory);

        endpoint.setId(endpointId);
        endpoint.setGroupId(consumerProperties.getProperty(ConsumerConfig.GROUP_ID_CONFIG));
        endpoint.setBean(bean);
        endpoint.setMethod(method);

        endpoint.setConsumerProperties(consumerProperties);
        endpoint.setTopics(topics);

        registrar.registerEndpoint(endpoint);
        registrar.afterPropertiesSet();
    }

}