使用spring-kafka ReplyingKafkaTemplate

时间:2020-04-08 15:21:35

标签: apache-kafka spring-kafka

您好,我对ReplyingKafkaTemplate具有以下配置,我想根据相关性ID在使用者之前过滤消息,但由于某些原因,任何人都无法过滤它的原因。

@Bean
public ConcurrentMessageListenerContainer<String, FireflyResponse> replyContainer() {
    ConcurrentKafkaListenerContainerFactory<String, FireflyResponse> factory = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(consumerFactory());
    RetryTemplate retryTemplate = new RetryTemplate();
    retryTemplate.setRetryPolicy(new SimpleRetryPolicy(retry));
    factory.setRetryTemplate(retryTemplate);
    factory.setConcurrency(3);
    factory.setBatchListener(true);
    factory.setAckDiscarded(true);
     factory.setRecordFilterStrategy(new RecordFilterStrategy<String, FireflyResponse>() {
        @Override
        public boolean filter(ConsumerRecord<String, FireflyResponse> consumerRecord) {
            return consumerRecord.headers().lastHeader(KafkaHeaders.CORRELATION_ID) == null;
        }
    });
    return factory.createContainer(responseTopic);
}

@Bean
public ReplyingKafkaTemplate<String, FireflyRequest, FireflyResponse> kafkaTemplate(
    ConcurrentMessageListenerContainer<String, FireflyResponse> replyContainer) {
    ReplyingKafkaTemplate<String, FireflyRequest, FireflyResponse> template = new ReplyingKafkaTemplate<>(
        producerFactory(), replyContainer);
    template.setDefaultReplyTimeout(Duration.ofSeconds(connectionTimeout));
    template.setSharedReplyTopic(true);
    return template;
}

1 个答案:

答案 0 :(得分:0)

回复模板总是设置相关ID标头...

@Override
public RequestReplyFuture<K, V, R> sendAndReceive(ProducerRecord<K, V> record, @Nullable Duration replyTimeout) {
    Assert.state(this.running, "Template has not been start()ed"); // NOSONAR (sync)
    CorrelationKey correlationId = this.correlationStrategy.apply(record);
    Assert.notNull(correlationId, "the created 'correlationId' cannot be null");
    ...

它需要将回复与请求相关联。

编辑

您似乎正在尝试过滤响应;不支持;仅过滤请求。

如果您不想回复,只需从侦听器返回null