Spring boot 当使用@EmbeddedKafka时,@DirtiesConfig的正确方式是什么

Spring boot 当使用@EmbeddedKafka时,@DirtiesConfig的正确方式是什么,spring-boot,spring-kafka,spring-kafka-test,Spring Boot,Spring Kafka,Spring Kafka Test,我们的项目中有一个“小”问题:“无法建立到节点0的连接。代理可能不可用。”测试运行很长时间,并且此消息至少每秒记录一次。但我发现,如何摆脱它。继续读下去。如果配置/注释中存在错误,请告知我 版本一: <springframework.boot.version>2.1.8.RELEASE</springframework.boot.version> 然后我们在里面做了一些测试,比如: @Test @DirtiesContext public void testPostW

我们的项目中有一个“小”问题:“无法建立到节点0的连接。代理可能不可用。”测试运行很长时间,并且此消息至少每秒记录一次。但我发现,如何摆脱它。继续读下去。如果配置/注释中存在错误,请告知我

版本一:

<springframework.boot.version>2.1.8.RELEASE</springframework.boot.version>
然后我们在里面做了一些测试,比如:

@Test
@DirtiesContext

public void testPostWhatever() throws JSONException, IOException {
这个测试只是创建一些请求数据,调用post,然后将数据持久化到DB中。然后我们将使用GET来发现,我们是否能够找到这些数据。琐碎的。对我来说有点奇怪的是这里的事务处理。测试类用@Transactional注释,但根据日志,事务仅在控制器方法上打开,该方法在本例中具有相同的@Transactional注释(当然,它应该在服务上)。两者都是TxType.REQUIRED传播。这将导致测试启动的回滚实际上不回滚任何内容,因为事务已经提交。如果你知道为什么会这样,请告诉我。但这并不是这个问题的关键。到目前为止,我们只是将@DirtiesContext放在这个方法上,它应该只是重新初始化上下文。它以上下文重新初始化的高成本解决了不回滚数据的问题。但以下消息开始出现在日志中:

2019-10-01 13:49:07.336 org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-2] Connection to node 0 could not be established. Broker may not be available.
2019-10-01 13:49:07.699 org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Connection to node 0 could not be established. Broker may not be available.
2019-10-01 13:49:08.191 org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-2] Connection to node 0 could not be established. Broker may not be available.
2019-10-01 13:49:08.603 org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Connection to node 0 could not be established. Broker may not be available.
2019-10-01 13:49:08.927 o.a.c.loader.WebappClassLoaderBase       : The web application [ofs] appears to have started a thread named [kafka-producer-network-thread | producer-2] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
 sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
 sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
 sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
 sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
 org.apache.kafka.common.network.Selector.select(Selector.java:691)
 org.apache.kafka.common.network.Selector.poll(Selector.java:411)
 org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:510)
 org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:239)
 org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:163)
 java.lang.Thread.run(Thread.java:748)
删除此
@DirtiesContext
并将其放置在类级别,如

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
有相同的行为(除了可笑的额外开销)。但是,如果我删除所有@DirtiesContext,手动清除数据库并提交更改,以便在每次测试后恢复更改,那么一切都正常工作,没有警告或错误


所以我认为有两件事。我的问题是由不正确的tx处理引起的(请帮助),但是@DirtiesContext也可以与spring kafka一起使用,这似乎不起作用。要么原则上不可能(或者是?),要么我的配置不正确(请帮助),要么它可能是一个bug?

如果您使用的是JUnit4,您可以将
EmbeddedKafkaRule
作为
@ClassRule
而不是使用
@EmbeddedKafka
,这样就不会将代理添加到上下文中


不幸的是,JUnitt5没有等价物,但您仍然可以添加一个静态的
嵌入式Kafkabroker
,然后自己用
@方法销毁它。

如果您使用的是JUnit4,您可以使用
EmbeddedKafkaRule
作为
@ClassRule
而不是使用
@EmbeddedKafka
,这样代理就不会添加到上下文中


不幸的是,JUnitt5没有等价物,但您仍然可以添加一个静态的
嵌入式Kafkabroker
,然后自己用
@方法销毁它。

谢谢您的回答。我试过了,它似乎有助于“[Producer clientId=Producer-2]与节点0的连接无法建立。代理可能不可用。”日志消息(这会造成大部分混乱&可能是问题)但出现错误:“web应用程序[ofs]似乎启动了一个名为[kafka Producer network thread | Producer-2]的线程。”似乎仍然存在。因此,这是一种改进,但不是完整的解决方案。如果你真的需要将上下文标记为dirty.removing all@DirtiesContext可以解决所有问题,但我不确定这对不能在集成测试中删除这些注释的人来说是否不是问题。谢谢你的回答。我试过了,它似乎有助于“[Producer clientId=Producer-2]与节点0的连接无法建立。代理可能不可用。”日志消息(这会造成大部分混乱&可能是问题)但出现错误:“web应用程序[ofs]似乎启动了一个名为[kafka Producer network thread | Producer-2]的线程。”似乎仍然存在。因此,这是一种改进,但不是完整的解决方案。如果您真的需要将上下文标记为dirty.removing all@DirtiesContext可以解决所有问题,但我不确定这对不能在集成测试中删除这些注释的人来说是否不是问题。
2019-10-01 13:49:07.336 org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-2] Connection to node 0 could not be established. Broker may not be available.
2019-10-01 13:49:07.699 org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Connection to node 0 could not be established. Broker may not be available.
2019-10-01 13:49:08.191 org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-2] Connection to node 0 could not be established. Broker may not be available.
2019-10-01 13:49:08.603 org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Connection to node 0 could not be established. Broker may not be available.
2019-10-01 13:49:08.927 o.a.c.loader.WebappClassLoaderBase       : The web application [ofs] appears to have started a thread named [kafka-producer-network-thread | producer-2] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
 sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
 sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
 sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
 sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
 org.apache.kafka.common.network.Selector.select(Selector.java:691)
 org.apache.kafka.common.network.Selector.poll(Selector.java:411)
 org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:510)
 org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:239)
 org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:163)
 java.lang.Thread.run(Thread.java:748)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)