请参阅随附的系统图。
问题:当我尝试将消息发布到输入通道时,代码会尝试连接到数据库并抛出无法连接的异常。
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来从队列中读取和写入。
答案 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 ***********永远不会被打印出来。