如何让Spring Integration的Jdbc入站通道适配器在指定事件后启动轮询?
解决方案
要实现仅在调用/inventoryStatus接口后才启动JDBC轮询,你可以通过控制Spring Integration入站适配器的生命周期来实现,具体步骤如下:
1. 修改XML配置,禁用自动启动
给int-jdbc:inbound-channel-adapter添加id并设置autoStartup="false",这样应用启动时不会自动开始轮询:
<int-jdbc:inbound-channel-adapter id="jdbcInboundAdapter" channel="fromdb" data-source="dataSource" max-rows-per-poll="100" query="SELECT * FROM Items WHERE INVENTORY_STATUS = 0" update="UPDATE Items SET INVENTORY_STATUS = 1" autoStartup="false"> <int:poller fixed-delay="4000" /> </int-jdbc:inbound-channel-adapter>
2. 在Controller中控制适配器启动
注入适配器实例(它实现了Lifecycle接口),在接口调用时启动轮询:
@RestController public class FileConsumerController { private final Logger logger = LoggerFactory.getLogger(FileConsumerController.class); private final Lifecycle jdbcInboundAdapter; // 构造注入适配器实例 public FileConsumerController(@Qualifier("jdbcInboundAdapter") Lifecycle jdbcInboundAdapter) { this.jdbcInboundAdapter = jdbcInboundAdapter; } @GetMapping(value = "/inventoryStatus") public ResponseEntity<String> getInventoryStatus(@RequestParam("accId") String accId){ if (!jdbcInboundAdapter.isRunning()) { jdbcInboundAdapter.start(); logger.info("JDBC轮询已启动"); return ResponseEntity.ok("库存状态轮询已启动"); } logger.info("JDBC轮询已在运行"); return ResponseEntity.ok("库存状态轮询已在运行中"); } }
原理说明
autoStartup="false"会阻止Spring在应用启动时自动启动适配器的轮询任务。int-jdbc:inbound-channel-adapter的底层实现类AbstractEndpoint实现了Spring的Lifecycle接口,通过调用start()方法可以手动触发轮询任务的启动,isRunning()方法用于判断适配器是否已在运行,避免重复启动。
内容的提问来源于stack exchange,提问作者Krishan
相关产品推荐
相关产品推荐

