Spring Integration + SpringBoot JUnit пытается неожиданно подключиться к БД - PullRequest
0 голосов
/ 26 мая 2018

См. Прилагаемую системную диаграмму.

системная диаграмма здесь

ВЫПУСК: Когда я пытаюсь отправить сообщение на входной канал,Код пытается подключиться к БД и выдает исключение, что он не может подключиться.

Код внутри 5 -> Чтение из канала, применение бизнес-логики (пока пусто) и отправкаответ на другой канал.

@Bean
public IntegrationFlow sendToBusinessLogictoNotifyExternalSystem() {

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

Я написал JUnit для 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 голосов
/ 27 мая 2018

СЛУЧАЙ ТЕСТА JUNIT - ОБНОВЛЕНО:

@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: Поток, который обрабатывает сообщение в БД

    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 *********** никогда не печатается.

0 голосов
/ 26 мая 2018

Поскольку общий канал является каналом публикации / подписки, сообщение отправляется в оба потока.

Если это продолжение этого вопроса / ответа , вы можете запретитьПоток БД от вызова путем вызова stop() в потоке sendToDb (при условии, что для ignoreFailures установлено значение true в пабе / подканале, как я и предлагал.

((Lifecycle) sendToDb).stop();
...