如何通过REST API调用Spring JDBC入站通道适配器?
解决方案
要实现仅在调用REST API后触发JDBC入站通道适配器读取数据库,你需要修改适配器的自动启动配置,并在API接口中手动触发轮询操作,具体步骤如下:
1. 修改JDBC入站适配器的XML配置
给适配器添加id标识,并关闭自动启动(auto-startup="false"),这样Spring Boot启动时不会自动触发轮询:
<int-jdbc:inbound-channel-adapter id="jdbcAccountAdapter" query="select * from accounts" data-source="dataSource" max-rows-per-poll="100" row-mapper="AccountsRowMapper" channel="Accountchannel" auto-startup="false"> </int-jdbc:inbound-channel-adapter>
2. 在REST控制器中手动触发适配器轮询
将JDBC适配器实例注入到控制器中,在generateFile接口方法里手动调用适配器的查询逻辑,并将结果发送到指定通道。如果需要处理所有符合条件的数据(因为你设置了max-rows-per-poll="100"),可以循环调用直到没有数据返回:
@RestController public class FileGenerateController { private final JdbcPollingChannelAdapter jdbcAccountAdapter; private final MessageChannel accountChannel; // 构造注入适配器和目标通道 public FileGenerateController(JdbcPollingChannelAdapter jdbcAccountAdapter, @Qualifier("Accountchannel") MessageChannel accountChannel) { this.jdbcAccountAdapter = jdbcAccountAdapter; this.accountChannel = accountChannel; } @GetMapping(value = "/generateFile") public void generateFile(String region) { Message<?> dataMessage; // 循环轮询直到没有数据返回,处理所有符合条件的账户数据 while ((dataMessage = jdbcAccountAdapter.receive()) != null) { accountChannel.send(dataMessage); } } }
关键说明
auto-startup="false":禁用适配器的自动启动逻辑,避免Spring Boot启动时就开始轮询数据库。jdbcAccountAdapter.receive():手动触发一次数据库查询,返回封装了查询结果的Message对象;如果没有数据则返回null。- 循环调用
receive():因为你设置了max-rows-per-poll="100",单次查询最多返回100条数据,循环调用可以确保处理完所有符合条件的数据。
如果你只需要触发单次查询(不管是否有剩余数据),直接调用一次receive()和send()即可。
内容的提问来源于stack exchange,提问作者Nichole
相关产品推荐
相关产品推荐

