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
相关产品推荐
相关产品推荐

