You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:13:36