Spring Integration + SpringBoot JUnit尝试意外连接到DB

时间:2018-05-26 17:21:20

标签: spring-boot junit spring-integration

请参阅随附的系统图。

system diagram here

问题:当我尝试将消息发布到输入通道时,代码会尝试连接到数据库并抛出无法连接的异常。

5内的代码 - >从通道读取,应用业务逻辑(暂时为空)并将响应发送到另一个通道。

@Bean
public IntegrationFlow sendToBusinessLogictoNotifyExternalSystem() {

    return IntegrationFlows
            .from("CommonChannelName")
            .handle("Business Logic Class name") // Business Logic empty for now
            .channel("QueuetoAnotherSystem")
                            .get();
    } 

我已经编写了JUnit for 5,如下所示,

@Autowired
    PublishSubscribeChannel CommonChannelName;
    @Autowired
    MessageChannel QueuetoAnotherSystem;

    @Test
    public void sendToBusinessLogictoNotifyExternalSystem() {
        Message<?> message = (Message<?>) MessageBuilder.withPayload("World")
                .setHeader(MessageHeaders.REPLY_CHANNEL, QueuetoAnotherSystem).build();
        this.CommonChannelName.send((org.springframework.messaging.Message<?>) message);
        Message<?> receive = QueuetoAnotherSystem.receive(5000);

        assertNotNull(receive);
        assertEquals("World", receive.getPayload());
    }

问题:从系统图中可以看出,我的代码在不同的流程上也有数据库连接。

当我尝试将消息发布到生产者频道时,代码会尝试连接到数据库并抛出一个无法连接的异常。

我不希望这种情况发生,因为JUnit永远不应该与数据库相关,并且应该随时随地运行。

How do I fix this exception?

注意:不确定是否重要,该应用程序是一个Spring Boot应用程序。我在代码中使用了Spring Integration来从队列中读取和写入。

2 个答案:

答案 0 :(得分:0)

由于公共信道是发布/订阅信道,因此消息将转发到两个流。

如果这是this question/answer的后续操作,您可以通过调用stop()流上的sendToDb来阻止调用数据库流(只要您设置{{1}在pub / sub频道上为true,就像我在那里建议的那样。

ignoreFailures

答案 1 :(得分:0)

JUNIT TEST CASE - 更新:

@Autowired
    PublishSubscribeChannel CommonChannelName;
    @Autowired
    MessageChannel QueuetoAnotherSystem;
    @Autowired
    SendResponsetoDBConfig sendResponsetoDBConfig;

    @Test
    public void sendToBusinessLogictoNotifyExternalSystem() {
        Lifecycle flowToDB = ((Lifecycle) sendResponsetoDBConfig.sendToDb());
        flowToDB.stop();
        Message<?> message = (Message<?>) MessageBuilder.withPayload("World")
                .setHeader(MessageHeaders.REPLY_CHANNEL, QueuetoAnotherSystem).build();
        this.CommonChannelName.send((org.springframework.messaging.Message<?>) message);
        Message<?> receive = QueuetoAnotherSystem.receive(5000);

        assertNotNull(receive);
        assertEquals("World", receive.getPayload());
    }

代码4:处理DB消息的流程

    public class SendResponsetoDBConfig {
    @Bean
    public IntegrationFlow sendToDb() {
    System.out.println("******************* Inside SendResponsetoDBConfig.sendToDb ***********");
    return IntegrationFlows
            .from("Common Channel Name")
            .handle("DAO Impl to store into DB")
            .get();
    }   
}

注意: *******************内部SendResponsetoDBConfig.sendToDb ***********永远不会被打印出来。