即时建设弹簧整合路线

时间:2014-09-04 01:30:55

标签: spring spring-integration

我需要构建一个从数据库生成报告的小型报告应用程序。目前,每天和每周只有2个报告。好的人们这就是我想要做的事情,以便将来可以轻松扩展。

1)扫描报告目录中的 .properties文件,其内容如下:     report.name =每周管理报告     report.datasource = myDataSource     report.bootstrap.sql = SELECT getdate()     report.cron.expression = 0/2 * * * MON-FRI     report.service.activator.class = reporting.qvalent.JDBCReportExtractor     report.recipient.email=konstantin@localhost

2)对于每个文件,创建一个弹簧集成路由,它将执行以下操作:  a)根据cron表达式使用引导查询轮询数据库  b)调用激活器类,它实际上将从数据源收集所有必需的数据,并可能丰富Thymeleaf上下文  c)将百万美元上下文与模板合并并通过电子邮件发送

我现在做的是:

public class ReportDefinitionLoader implements BeanDefinitionRegistryPostProcessor {
       private ConfigurableListableBeanFactory beanFactory;

private void prepareBeansForReport(Resource resource) throws IOException {
    try {
        Properties props = PropertiesLoaderUtils.loadProperties(resource);
        String reportName = props.getProperty(REPORT_NAME_PROPERTY);
        String reportDatasource = props.getProperty(REPORT_DATASOURCE_PROPERTY);
        String reportCronExpression = props.getProperty(REPORT_CRON_EXPRESSION_PROPERTY);
        String reportBootstrapQuery = props.getProperty(REPORT_BOOTSTRAP_QUERY_PROPERTY);
        CronTrigger cronTrigger = new CronTrigger(reportCronExpression);
        beanFactory.registerSingleton(reportName + CRON_TRIGGER_BEAN_NAME, cronTrigger);
        DataSource dataSource = (DataSource) beanFactory.getBean(reportDatasource);
        beanFactory.getBean()
        beanFactory.autowireBean(dataSource);
        QueueChannel channel1 = new QueueChannel();
        JdbcPollingChannelAdapter jdbcPollingChannelAdapter = new JdbcPollingChannelAdapter(dataSource, reportBootstrapQuery);
        SourcePollingChannelAdapter adapter = new SourcePollingChannelAdapter();
        TimerManagerTaskScheduler taskScheduler = new TimerManagerTaskScheduler();
        taskScheduler.schedule(new Runnable() {
            @Override
            public void run() {

            }
        }, cronTrigger);
        adapter.setOutputChannel(channel1);
        adapter.setSource(jdbcPollingChannelAdapter);
        adapter.setBeanFactory(beanFactory);
        adapter.setTaskScheduler(taskScheduler);
        adapter.start();
    } catch (IOException e) {
        LOG.error("Could not load properties from resource: " + resource.getFile().getName(), e);
    }
}
}

但是dataSource bean具有XML

中定义的未解析属性
  <bean id="myDataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
  <property name="driverClass" value="${jdbc.driver}" />
  <property name="jdbcUrl" value="${jdbc.url}" />
  <property name="user" value="${jdbc.user}" />
  <property name="password" value="${jdbc.password}" />

你能否告诉我如何从Spring上下文中获取bean,以便在另一个也可以放在spring上下文中的类中进一步使用它?目前,我在启动时会得到这些:

2014-09-04 11:15:12,545 [WARN] - Could not load driverClass ${jdbc.driver}
java.lang.ClassNotFoundException: ${jdbc.driver}
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:190)
    at com.mchange.v2.c3p0.DriverManagerDataSource.ensureDriverLoaded(DriverManagerDataSource.java:100)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:132)

当我使用XML配置时,数据源属性已解析好,所以这个问题不是因为配置错误的PropertyPlaceholderConfigurer。

1 个答案:

答案 0 :(得分:0)

我实现了错误的接口 - InitializingBean似乎是正确的。 现在我在afterPropertiesSet()回调中创建bean定义。橡皮鸭调试确实有效!谢谢大家。