Camel:使用spring-boot配置的数据源

时间:2015-10-13 12:18:12

标签: jdbc spring-boot apache-camel

我有一个项目,其中我使用spring-boot-jdbc-starter并自动为我配置数据源。 现在我将camel-spring-boot添加到项目中,并且我能够成功地从类型为RouteBuilder的Bean创建路由。 但是当我使用camel的sql组件时,它无法找到数据源。有没有简单的方法将Spring配置的数据源添加到CamelContext?在camel项目的示例中,他们使用spring xml进行数据源配置,但我正在寻找一种使用java配置的方法。这就是我试过的:

@Configuration
public class SqlRouteBuilder extends RouteBuilder {
  @Bean
  public SqlComponent sqlComponent(DataSource dataSource) {
    SqlComponent sqlComponent = new SqlComponent();
    sqlComponent.setDataSource(dataSource);
    return sqlComponent;
  }

  @Override
  public void configure() throws Exception {
    from("sql:SELECT * FROM tasks WHERE STATUS NOT LIKE 'completed'")
            .to("mock:sql");
  }
}

2 个答案:

答案 0 :(得分:0)

以下是示例/示例代码(Java DSL)。为此我用了

  • 春季启动
  • H2嵌入式数据库
  • 骆驼

在启动spring-boot时,创建表并加载数据。然后是骆驼路线,跑步"选择"拉数据。

以下是代码

public void configure() throws Exception {

    from("timer://timer1?period=1000")
    .setBody(constant("select * from Employee"))
    .to("jdbc:dataSource")
    .split().simple("${body}")
    .log("process row ${body}")

full example in github

答案 1 :(得分:0)

我必须发布它,因为尽管答案在注释中,但您可能没有注意到,在我看来,这样的配置对于运行该过程是必需的。 SQL组件的使用应如下所示:

Employee employee = new Employee();

employee.setEmployeeName(result.getOrDefault("employeeName", "").toString());

employee.setEmployeeName(!StringUtils.isEmpty(result.get("employeeName").toString()) ? result.get("employeeName").toString() : " "); 
// when i am using this solution it is not giving null pointer exception 
// but if the value is null then it is returning "null" value it means 
// null as a string which shouldn't be the expected output. 

employee.setEmployeeName(String.valueOf(result.get("employeeName").equals("null") ? "" : result.get("employeeName")));

List<Map<String,Object>> r1 = new ArrayList<Map<String,Object>>();
    response.forEach(result -> { 
        employee.setEmployeeName(result.getOrDefault("employeeName", "").toString());

    })

请注意 from("timer://dbQueryTimer?period=10s") .routeId("DATABASE_QUERY_TIMER_ROUTE") .to("sql:SELECT * FROM event_queue?dataSource=#dataSource") .process(xchg -> { List<Map<String, Object>> row = xchg.getIn().getBody(List.class); row.stream() .map((x) -> { EventQueue eventQueue = new EventQueue(); eventQueue.setId((Long)x.get("id")); eventQueue.setData((String)x.get("data")); return eventQueue; }).collect(Collectors.toList()); }) .log(LoggingLevel.INFO,"******Database query executed - body:${body}******"); 的使用。 ?dataSource=#dataSource名称指向Spring配置的DataSource对象,可以将其更改为另一个对象,从而在不同的路由中使用不同的DataSource。