在春季测试Kafka使用者时如何在Kafka中设置端口

时间:2019-05-20 17:12:11

标签: java spring-kafka spring-kafka-test

我正在使用spring-boot-starter-parent版本1.5.0.RELEASEspring-kafka版本1.0.0.RELEASEspring-kafka-test版本1.0.0.RELEASE的应用程序中使用来自{ {1}}集群。我为使用Kakfa 0.9的消费者进行了单元测试,但是由于经纪人端口是随机拾取的,因此它失败了。有没有一种方法可以设置该代理属性而不更改版本?还是我应该使用哪个版本以便不破坏任何内容?

这是KafkaEmbeddedKafkaListener的代码。

Listener.java

KafkaConsumerTest

KafkaConsumerTest.java EDIT

@Service
public class Listener {

    private static final Logger logger = LoggerFactory.getLogger(Listener.class);
    private CountDownLatch latch = new CountDownLatch(1);

    @KafkaListener(topics = "topic", group = "group", containerFactory = "kafkaListenerContainerFactory")
    public void consumeClicks(@Payload String msg, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) Integer partition, @Header(KafkaHeaders.OFFSET) Integer offset, Acknowledgment ack) throws Exception {
        logger.info(msg);
        latch.countDown();
        ack.acknowledge();
    }

    public CountDownLatch getLatch() {
        return latch;
    }
}

2 个答案:

答案 0 :(得分:0)

请在引导1.5中使用spring-kafka 1.3.9;不再支持早期版本。当前的引导1.5.x版本是1.5.21。

@ClassRule
public static KafkaEmbedded embeddedKafka = new KafkaEmbedded(1, true, TEST_TOPIC);

static {
    embeddedKafka.setKafkaPorts(1234);
}

setKafkaPorts从1.3开始可用。

但是,您在测试中正确使用了分配的随机端口

Map<String, Object> senderProps = KafkaTestUtils.senderProps(embeddedKafka.getBrokersAsString());

要使kafka侦听器连接到嵌入式代理,可以使用。

    System.setProperty("spring.kafka.bootstrap-servers", embeddedKafka.getBrokersAsString()); 

答案 1 :(得分:0)

我认为,在加载应用程序上下文进行测试时,正在创建两个类型为(ProducerFactory and KafkaTemplate)的bean,一个是使用原始配置,第二个是使用测试配置,请尝试对此使用不同的配置文件进行测试application-test.yml并添加Bean覆盖属性

spring.main.allow-bean-definition-overriding to true.

因此它将用测试Bean覆盖应用程序Bean,并在测试中将ProducerFactoryKafkaTemplate声明为与应用程序中相同名称的Bean