我在我的junit测试中使用EmbeddedSingleNodeKafkaCluster(code-v4.1.1)和相关类。在我引入一个单元测试来测试消息的前向兼容性并期望它失败之前(因为它缺少一个名为correlationId的字段),它一直可以正常工作:
org.apache.kafka.common.errors.SerializationException: Error deserializing key/value for partition event_source.invoices-0 at offset 0. If needed, please seek past the record to continue consumption.
Caused by: org.apache.kafka.common.errors.SerializationException: Error deserializing Avro message for id 1
Caused by: org.apache.avro.AvroTypeException: Found com.q2c.schema.avro.invoice.InvoiceEvents, expecting com.q2c.schema.avro.invoice.InvoiceEvents, missing required field correlationId
at org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:292)
at org.apache.avro.io.parsing.Parser.advance(Parser.java:88)
此单元测试总是成功的,并且一切都如预期。.但是下一个单元测试(第二个)“有时”失败了!当执行第二个单元测试时(每个方法后面都有脏上下文,并且可以看到对于第一个测试/代理正确调用了EmbeddedSingleNodeKafkaCluster.stop()),将创建一个新的Kafka代理,但是以下代码:
kafka = TestUtils.createServer(kafkaConfig, Time.SYSTEM); // line 77
还包括上一个单元测试创建的3个主题(event_source.invoices-0)中的1个!结果是第二个单元测试将失败,因为代理将无法创建event_source.invoices-0(它已经存在)。
调试之后,我注意到第一个单元测试的代理(每个代理都有其单独的tmp目录)仍然具有主题event_source.invoices-0的文件夹,并且在00000000000000000000.timeindex中只有一个文件。在stop()删除时,由于某些进程正在使用该文件,因此无法删除该文件。但是删除是在代理停止后发生的。什么可能会锁定文件?
此外,正如我提到的,每个单元测试的代理都有自己的tmp目录。我不明白为什么第二个单元测试中的TestUtils.createServer()也创建主题event_source.invoices主题?
任何帮助和想法都非常受欢迎!
在Windows和Linux中都会发生。
<kafka-version>1.0.1</kafka-version>
<kafka-streams-version>1.0.1</kafka-streams-version>
致谢!