当前位置: 首页 > 知识库问答 >
问题:

junit结束时强制停止spring boot

武嘉祥
2023-03-14

实际上,我有一个Spring Boot应用程序,我使用Kafka嵌入而不使用SpringKafka,而是使用合流库。

我配置了自定义拓扑,当我启动jUnit时,流仍然是监听的,Spring引导服务器不会结束。

我尝试使用@DirtiesContext,但问题仍然存在。

对于启动jUnit我使用

@RunWith(SpringRunner.class)
@SpringBootTest

当消费者处于循环中时,我在控制台中看到以下消息:

无法建立到节点-1的连接。经纪人可能不可用。

提示?

谢啦

共有1个答案

方树
2023-03-14

似乎出现错误是因为代理没有运行。但是KafkaStreams正在运行。

为了修复它,我认为您需要在测试时阻止KafkaStreams运行。

@SpringBootTest注释提供了一个属性类。您可以指定将注册为bean的类

您可以通过指定class属性来防止与KafkaStreams相关的bean被注册。

例如,可以如下测试。在这种情况下,不会发生上述问题,因为KafkaStreams相关bean没有注册。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ServiceImpl.class, CommonConfig.class})
public class SomeClassTest {
    @Autowired
    private ServiceImpl articleServiceImpl;

    // do test
}

使用@SpringBootTest时,最好只注册要测试的bean。

如果您不熟悉这种方法,请尝试嘲笑管理KafkaStreams对象的bean

例如,我创建以下bean来开始和结束KafkaStreams对象。

@Component
public class ManageableStream implements DisposableBean, InitializingBean {

    private final KafkaStreams kafkaStreams;

    public ManageableStream() {
        StreamsConfig config = buildStreamConfig();
        StreamsBuilder builder = new StreamsBuilder();

        KStream<String, String> inputStream = builder.stream("source.topic");
        inputStream.to("destination.topic");

        Topology topology = builder.build();
        kafkaStreams = new KafkaStreams(topology, config);
    }

    @Override
    public void destroy() throws Exception {
        kafkaStreams.close();
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        kafkaStreams.start();
    }

    private StreamsConfig buildStreamConfig() {
        Map<String, Object> properties = new HashMap<>();
        properties.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");

        properties.put(StreamsConfig.APPLICATION_ID_CONFIG, "test-stream-application");
        properties.put(StreamsConfig.PROCESSING_GUARANTEE_CONFIG, AT_LEAST_ONCE);
        properties.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.StringSerde.class);
        properties.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.StringSerde.class);

        return new StreamsConfig(properties);
    }
}

测试时,模拟管理KafkaStreams对象的bean。

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @MockBean
    private ManageableStream manageableStream;

    @Test
    public void contextLoads() {
    }

}

那么Kafka团队就不会启动,所以上述问题就不会发生。

如果你想测试KafkaStreams的拓扑结构,请查看下面的链接

https://kafka.apache.org/11/documentation/streams/developer-guide/testing.html

我希望我的回答有帮助

 类似资料:
  • 我目前正在使用weblogic,问题是我在我的weblogic服务器上部署了几个应用程序。不幸的是,当这个应用程序中的一个由于X/Y原因而无法部署时,我只想强制停止这个应用程序并传递给另一个。 我已经查看了WLST文档,但没有找到我要搜索的内容。以下是我使用的函数: 停止应用程序(applicationName,gracefulProductionToAdmin=“true”,gracefulIg

  • 问题内容: 看一下这段代码: 通常,到达的结尾时,程序会终止。但是在此示例中,程序将打印“ main of End”,然后继续运行,因为线程仍在运行。有没有一种方法可以使线程在结束时 自动 停止,而无需使用类似的东西? 问题答案: 您正在创建的线程是独立的,并且不依赖于主线程终止。您可以使用线程。 当没有其他线程在运行时,守护进程线程将由JVM终止,它也包括一个执行主线程。

  • 问题内容: 我现在正在制作CSS动画,在其中我正在移动内容并希望它停留在最终位置,直到用户将鼠标移开为止。 无论何时动画结束,它都会重复播放。我只希望它发生一次并保持原样,直到用户离开。我尝试使用规范中已暂停的内容,但此功能无法正常运行。任何帮助表示赞赏。谢谢。:) 问题答案: 以下评论对我有用。谢谢迈克尔 “您需要添加填充模式以在动画结束时冻结动画状态。 使动画处于最后一帧的状态 在开始时保留动

  • 如果按照步骤设置强制停止应用程序-

  • 当我使用Running Services选项卡下的stop按钮停止服务时,将调用onDestroy()方法。 但是当我强制停止应用程序时,onDestroy()永远不会被调用。 对此有何解释? 或者是一个解决方案,当强制停止时触发onDestroy()? 谢谢