我们的项目中有一个“小”问题:“无法建立到节点0的连接。代理可能不可用。”测试运行时间非常长,并且该消息至少每秒钟记录一次。但我发现了怎么摆脱它。继续往下读。如果配置/注释中有不正确的地方,请告诉我。
版本第一:
<springframework.boot.version>2.1.8.RELEASE</springframework.boot.version>会自动带来
<spring-kafka.version>2.2.8.RELEASE</spring-kafka.version>现在,我们将考虑由以下注释的集成测试:
@RunWith(SpringRunner.class)
@Import(/*some our configuration, irrelevant*/ )
@ActiveProfiles(/*some our profiles, irrelevant*/)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@EmbeddedKafka(controlledShutdown = true)
@Transactional我们在里面做了一些测试,比如:
@Test
@DirtiesContext
public void testPostWhatever() throws JSONException, IOException {这个测试只是创建一些请求数据,调用post,然后将数据持久化到DB中。然后我们会用GET来找出,我们是否能找到这些数据。微不足道。对我来说有点奇怪的是这里的事务处理。测试类使用@ transaction注释,但根据日志,只在Controller方法上打开事务,该方法在本例中(应该在服务上,确定地)具有相同的@事务注释。两者均与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,并手动清除db并提交更改,那么在每次测试之后,更改都会恢复,一切都正常,没有任何警告或错误。
所以我认为有两件事。我的问题是由不正确的tx处理引起的(请帮助),但是@DirtiesContext也应该可以与spring一起使用,这似乎是行不通的。原则上这是不可能的(或者是?),或者我的配置不正确(请帮助),或者它可能是一个bug?
发布于 2019-10-01 14:51:54
如果您使用的是JUnit4,则可以使用EmbeddedKafkaRule作为@ClassRule,而不是使用@EmbeddedKafka,然后不会将代理添加到上下文中。
不幸的是,JUnitt5没有等效的东西--但是您仍然可以添加一个静态EmbeddedKafkaBroker并在@AfterAll方法中自己销毁它。
https://stackoverflow.com/questions/58187190
复制相似问题