/** * Set the ack mode to use when auto ack (in the configuration properties) is false. * <ul> * <li>RECORD: Ack after each record has been passed to the listener.</li> * <li>BATCH: Ack after each batch of records received from the consumer has been * passed to the listener</li> * <li>TIME: Ack after this number of milliseconds; (should be greater than * {@code #setPollTimeout(long) pollTimeout}.</li> * <li>COUNT: Ack after at least this number of records have been received</li> * <li>MANUAL: Listener is responsible for acking - use a * {@link AcknowledgingMessageListener}. * </ul> * @param ackMode the {@link AbstractMessageListenerContainer.AckMode}; default BATCH. * @return the spec. * @see AbstractMessageListenerContainer.AckMode */ public KafkaMessageListenerContainerSpec<K, V> ackMode(AbstractMessageListenerContainer.AckMode ackMode) { this.container.getContainerProperties().setAckMode(ackMode); return this; }
/** * Set the ack mode to use when auto ack (in the configuration properties) is false. * <ul> * <li>RECORD: Ack after each record has been passed to the listener.</li> * <li>BATCH: Ack after each batch of records received from the consumer has been * passed to the listener</li> * <li>TIME: Ack after this number of milliseconds; (should be greater than * {@code #setPollTimeout(long) pollTimeout}.</li> * <li>COUNT: Ack after at least this number of records have been received</li> * <li>MANUAL: Listener is responsible for acking - use a * {@link AcknowledgingMessageListener}. * </ul> * @param ackMode the {@link AbstractMessageListenerContainer.AckMode}; default BATCH. * @return the spec. * @see AbstractMessageListenerContainer.AckMode */ public KafkaMessageListenerContainerSpec<K, V> ackMode(AbstractMessageListenerContainer.AckMode ackMode) { this.container.getContainerProperties().setAckMode(ackMode); return this; }
@Bean public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<ByteBuffer, ByteBuffer>> kafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory<ByteBuffer, ByteBuffer> factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(consumerFactory()); factory.getContainerProperties().setAckMode(AbstractMessageListenerContainer.AckMode.MANUAL); return factory; }
@Bean public KafkaMessageListenerContainer<String, String> container( ConsumerFactory<String, String> consumerFactory, ConfigProperties config) { ContainerProperties containerProperties = new ContainerProperties(config.getTopic()); containerProperties.setMessageListener(listener()); containerProperties.setAckMode(AckMode.MANUAL_IMMEDIATE); return new KafkaMessageListenerContainer<>(consumerFactory, containerProperties); }
/** * 添加KafkaListenerContainerFactory,用于批量消费消息 * @return */ @Bean public KafkaListenerContainerFactory<?> batchContainerFactory(){ ConcurrentKafkaListenerContainerFactory<Object, Object> containerFactory = new ConcurrentKafkaListenerContainerFactory<Object, Object>(); containerFactory.setConsumerFactory(consumerFactory()); containerFactory.setConcurrency(4); containerFactory.setBatchListener(true); //批量消费 containerFactory.getContainerProperties().setAckMode(AbstractMessageListenerContainer.AckMode.MANUAL_IMMEDIATE); return containerFactory; }
@Bean(name = "messageListenerContainer") public ConcurrentMessageListenerContainer<String, PublishedEventWrapper> messageListenerContainer() { Map<String, Object> consumerProperties = eventApisConfiguration.getEventBus().buildConsumerProperties(); consumerProperties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false); consumerProperties.put(ConsumerConfig.METADATA_MAX_AGE_CONFIG, 3000); DefaultKafkaConsumerFactory<String, PublishedEventWrapper> consumerFactory = new DefaultKafkaConsumerFactory<>(consumerProperties, new StringDeserializer(), new JsonDeserializer<>(PublishedEventWrapper.class)); ContainerProperties containerProperties = new ContainerProperties(Pattern.compile(eventTopicRegexStr)); containerProperties.setMessageListener(new MultipleEventMessageListener(eventMessageListeners)); containerProperties.setAckMode(AbstractMessageListenerContainer.AckMode.BATCH); ConcurrentMessageListenerContainer<String, PublishedEventWrapper> messageListenerContainer = new ConcurrentMessageListenerContainer<>(consumerFactory, containerProperties); messageListenerContainer.setBeanName("emon-events"); return messageListenerContainer; }
@Bean(name = "operationListenerContainer") public ConcurrentMessageListenerContainer<String, Operation> operationListenerContainer() { Map<String, Object> consumerProperties = eventApisConfiguration.getEventBus().buildConsumerProperties(); consumerProperties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false); DefaultKafkaConsumerFactory<String, Operation> operationConsumerFactory = new DefaultKafkaConsumerFactory<>(consumerProperties, new StringDeserializer(), new JsonDeserializer<>(Operation.class)); ContainerProperties containerProperties = new ContainerProperties(Operation.OPERATION_EVENTS); containerProperties.setMessageListener(new MultipleEventMessageListener(eventMessageListeners)); containerProperties.setAckMode(AbstractMessageListenerContainer.AckMode.BATCH); ConcurrentMessageListenerContainer<String, Operation> operationListenerContainer = new ConcurrentMessageListenerContainer<>(operationConsumerFactory, containerProperties); operationListenerContainer.setBeanName("emon-operations"); return operationListenerContainer; }
@Bean({"eventsKafkaListenerContainerFactory", "kafkaListenerContainerFactory"}) public ConcurrentKafkaListenerContainerFactory<String, PublishedEventWrapper> eventsKafkaListenerContainerFactory( EventMessageConverter eventMessageConverter, ConsumerFactory<String, PublishedEventWrapper> consumerFactory) { ConcurrentKafkaListenerContainerFactory<String, PublishedEventWrapper> factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(consumerFactory); factory.setConcurrency(eventApisConfiguration.getEventBus().getConsumer().getEventConcurrency()); factory.setMessageConverter(eventMessageConverter); factory.getContainerProperties().setPollTimeout(3000); ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(eventApisConfiguration.getEventBus().getConsumer().getEventSchedulerPoolSize()); scheduler.setBeanName("EventsFactory-Scheduler"); scheduler.initialize(); factory.getContainerProperties().setScheduler(scheduler); factory.getContainerProperties().setAckMode(AbstractMessageListenerContainer.AckMode.RECORD); return factory; }
if (!extendedConsumerProperties.getExtension().isAutoCommitOffset()) { messageListenerContainer.getContainerProperties() .setAckMode(AbstractMessageListenerContainer.AckMode.MANUAL); messageListenerContainer.getContainerProperties().setAckOnError(false);
@Bean("operationsKafkaListenerContainerFactory") public ConcurrentKafkaListenerContainerFactory<String, Operation> operationsKafkaListenerContainerFactory( ConsumerFactory<String, Operation> consumerFactory, PlatformTransactionManager platformTransactionManager) { ConcurrentKafkaListenerContainerFactory<String, Operation> factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(consumerFactory); RetryTemplate retryTemplate = new RetryTemplate(); factory.setRetryTemplate(retryTemplate); factory.setConcurrency(eventApisConfiguration.getEventBus().getConsumer().getOperationSchedulerPoolSize()); ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(eventApisConfiguration.getEventBus().getConsumer().getOperationSchedulerPoolSize()); scheduler.setBeanName("OperationsFactory-Scheduler"); scheduler.initialize(); factory.getContainerProperties().setScheduler(scheduler); ThreadPoolTaskScheduler consumerScheduler = new ThreadPoolTaskScheduler(); consumerScheduler.setPoolSize(eventApisConfiguration.getEventBus().getConsumer().getOperationSchedulerPoolSize()); consumerScheduler.setBeanName("OperationsFactory-ConsumerScheduler"); consumerScheduler.initialize(); factory.getContainerProperties().setPollTimeout(3000L); factory.getContainerProperties().setAckOnError(false); factory.getContainerProperties().setConsumerTaskExecutor(consumerScheduler); factory.getContainerProperties().setAckMode(AbstractMessageListenerContainer.AckMode.RECORD); factory.getContainerProperties().setTransactionManager(platformTransactionManager); return factory; }