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

Apache Camel执行SQL插入请求不生效 排查代码配置问题

Apache Camel SQL路由执行失败排查

你这段代码跑不通,核心是几个低级问题加配置疏漏:

  • 数据库端口配置错误:PostgreSQL默认服务端口是5432,你配置的9201是Elasticsearch的默认端口,这个配置会直接导致数据源连接数据库失败,先把端口改成你实际PostgreSQL服务的端口。
  • 路由没有触发逻辑:你用的direct:query是同步直连端点,本身不会主动触发执行,必须有其他代码主动向这个端点发送消息,路由才会跑。你现在程序启动后没有任何触发动作,当然不会执行插入SQL。
  • 依赖没引全会直接报错:如果项目里没加camel-sql组件依赖和PostgreSQL JDBC驱动,运行时直接抛类找不到、组件不存在的异常,先核对依赖。
  • Bean绑定顺序不对:不要先加路由再绑数据源,路由初始化的时候会去注册表找myDataSource,你后绑的话容易报找不到bean的错,调整顺序先绑数据源再加路由。

如果你只是想测试启动程序就自动执行插入,直接把消费者端点换成timer组件做一次性触发就行,修正后的可运行代码如下:

import org.apache.camel.Main;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

public class CamelMain {

    public static void main(String... args) throws Exception {
        Main camelMain = new Main();
        // 先配置数据源
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.postgresql.Driver");
        // 替换成你实际的数据库地址、端口、库名
        dataSource.setUrl("jdbc:postgresql://localhost:5432/dbname");
        dataSource.setUsername("username");
        dataSource.setPassword("password");
        // 先把数据源绑定到Camel注册表
        camelMain.bind("myDataSource", dataSource);
        // 再添加路由
        camelMain.configure().addRoutesBuilder(createBasicRoute());
        camelMain.run(args);
    }

    static RouteBuilder createBasicRoute() {
        return new RouteBuilder() {
            @Override
            public void configure() {
                // timer组件:启动后延迟1秒执行,repeatCount=1表示只执行1次
                from("timer:runInsert?delay=1000&repeatCount=1")
                        .to("sql:insert into FileDetailTable (filename, Status, createdAt) values ('test', 'test', 'test')?dataSource=#myDataSource")
                        .log("SQL插入执行完成");
            }
        };
    }
}

如果你必须用direct:query端点,就加个启动监听器,等Camel上下文启动完手动发消息触发:

import org.apache.camel.main.MainListenerSupport;
import org.apache.camel.main.MainSupport;

// 把这段代码加在camelMain.run()之前即可
camelMain.addMainListener(new MainListenerSupport() {
    @Override
    public void afterStart(MainSupport main) {
        try {
            main.getCamelTemplate().sendBody("direct:query", null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});

最后核对下依赖,Maven项目需要引入这两个包,Camel组件版本和你本地使用的Camel版本对齐就行:

<!-- Camel SQL组件 -->
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-sql</artifactId>
    <version>替换为你使用的Camel版本</version>
</dependency>
<!-- PostgreSQL JDBC驱动 -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.6.0</version>
</dependency>

内容的提问来源于stack exchange,提问作者Jason Mootoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:51:28